仿redis的zset类型

embedded/2024/10/18 8:19:55/

前言
模仿redis的zset数据类型,写了Java内存版,写这个的背景是做自己的小项目,服务器资源有限,不想引入redis,但同时又想使用zset的排序功能,所以就自己写了一个简化版本。

java">package com.fjding.exam.utils;import lombok.ToString;import java.util.*;
import java.util.stream.Collectors;/*** 实现类似redis zset的功能** @author fjding* @date 2024/4/8*/
public class Zset<T> {public TreeSet<Entity> treeSet = new TreeSet<>();private Set<T> keySet = new HashSet<>();public static void main(String[] args) {Zset<Integer> zset = new Zset<>();zset.add(1);zset.add(4);zset.add(7);zset.add(6);zset.add(3);zset.add(3);System.out.println(zset.treeSet);}public void add(T key) {add(key, 1);}public void add(T key, Integer score) {if (keySet.contains(key)) {Entity entity = treeSet.stream().filter(e -> e.key.equals(key)).findFirst().get();// 解决当已添加元素后,再修改score时,无法重新排序问题treeSet.remove(entity);keySet.remove(key);entity.score += score;// 分数必须>0if (entity.score > 0) {treeSet.add(entity);keySet.add(key);}} else {keySet.add(key);treeSet.add(new Entity(key, score));}}public void remove(T key) {if (keySet.contains(key)) {keySet.remove(key);treeSet.removeIf(e -> e.key.equals(key));}}public void removeFirst() {Entity entity = treeSet.first();keySet.remove(entity.key);treeSet.remove(entity);}public void removeLast() {Entity entity = treeSet.last();keySet.remove(entity.key);treeSet.remove(entity);}public T getFirst() {return treeSet.first().key;}public T getLast() {return treeSet.last().key;}public List<T> range() {return range(1, 10);}public List<T> range(int page) {return range(page, 10);}/*** @param page 默认1* @param size 默认10*/public List<T> range(int page, int size) {if (page <= 0) {page = 1;}if (size <= 0) {size = 10;}int start = (page - 1) * size;int end = page * size;if (start >= treeSet.size()) {return Collections.emptyList();}if (end > treeSet.size()) {end = treeSet.size();}List<Entity> list = treeSet.stream().collect(Collectors.toList());List<Entity> subList = list.subList(start, end);return subList.stream().map(e -> e.key).collect(Collectors.toList());}public int size() {return keySet.size();}@ToStringpublic class Entity implements Comparable<Entity> {public T key;public Integer score;public Entity(T key, Integer score) {this.key = key;this.score = score;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Entity entity = (Entity) o;return key != null ? key.equals(entity.key) : entity.key == null;}@Overridepublic int hashCode() {return key != null ? key.hashCode() : 0;}@Overridepublic int compareTo(Entity o) {int scoreComparison = o.score.compareTo(score);//return scoreComparison;if (scoreComparison != 0) {return scoreComparison;} else {return o.key.toString().compareTo(key.toString());}}}
}

http://www.ppmy.cn/embedded/16351.html

相关文章

Linux使用Docker部署DashDot访问本地服务器面板

文章目录 1. 本地环境检查1.1 安装docker1.2 下载Dashdot镜像 2. 部署DashDot应用 本篇文章我们将使用Docker在本地部署DashDot服务器仪表盘&#xff0c;并且结合cpolar内网穿透工具可以实现公网实时监测服务器系统、处理器、内存、存储、网络、显卡等&#xff0c;并且拥有API接…

Transformer step by step--Positional Embedding 和 Word Embedding

Transformer step by step往期文章&#xff1a; Transformer step by step--层归一化和批量归一化 要把Transformer中的Embedding说清楚&#xff0c;那就要说清楚Positional Embedding和Word Embedding。至于为什么有这两个Embedding&#xff0c;我们不妨看一眼Transformer的…

COOIS 生产订单显示系统增强

需求说明&#xff1a;订单系统显示页面新增批量打印功能 增强点&#xff1a;CL_COIS_DISP_LIST_NAVIGATION -->TOOLBAR方法中新增隐式增强添加自定义打印按钮 增强点&#xff1a;BADI-->WORKORDER_INFOSYSTEM新增增强实施 实现位置&#xff1a;IF_EX_WORKORDER_INFOSYS…

2024年vue 开发环境 Node.js于win10环境下的安装

2024年vue 开发环境 Node.js于win10环境下的安装 导航 文章目录 2024年vue 开发环境 Node.js于win10环境下的安装导航一、下载node.js二、安装node.js三、测试(一)四、环境配置五、测试(二)六、安装淘宝镜像七、安装vue脚手架 一、下载node.js Node.js 官方网站下载&#xff…

Stable Diffusion中的embedding

Stable Diffusion中的embedding 嵌入&#xff0c;也称为文本反转&#xff0c;是在 Stable Diffusion 中控制图像样式的另一种方法。在这篇文章中&#xff0c;我们将学习什么是嵌入&#xff0c;在哪里可以找到它们&#xff0c;以及如何使用它们。 什么是嵌入embedding&#xf…

【鸿蒙应用】理财App

目录 第一节项目讲解项目介绍 第二节&#xff1a;项目创建登录静态框架编写登录页面设稿新建项目控制台添加项目Login页面封装标题组件 第三节&#xff1a;登录页静态表单编写第四节—内容页架构分析底部栏组件第五节—底部栏组件切换第六节&#xff1a;首页静态页编写第七节&a…

人耳的听觉特性

1、人耳的构成 • 人耳可以分成三个主要部分&#xff0c;即外耳、中耳和内耳。 • 声波通过人耳转化成听觉神经中的神经脉冲信号&#xff0c;传到人脑中的听觉中枢&#xff0c;引起听觉。 外耳、耳廓 外耳由最外面的耳廓、外耳道组成&#xff0c;到鼓膜为止。耳廓&#xf…

无人机+光电吊舱:4K AI 180倍混合变焦吊舱技术详解

无人机搭载吊舱是一种常见的配置方式&#xff0c;吊舱可以装载不同的设备&#xff0c;以满足不同的任务需求。吊舱通常挂载在无人机的下方或侧面&#xff0c;可以根据需要进行调整。 随着无人机技术的飞速进步&#xff0c;4K AI 180倍混合变焦吊舱技术的出现&#xff0c;将无人…