仿redis的zset类型

ops/2024/10/18 8:30:22/

前言
模仿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/ops/16327.html

相关文章

Python框架:Django和Flask介绍应用场景和优缺点

Python框架&#xff1a;Django和Flask介绍应用场景和优缺点 Django 和 Flask 都是 Python 语言的 Web 框架&#xff0c;它们用于构建 Web 应用程序。以下是它们的基本介绍、使用方式、优点、缺点以及适用场景的对比。 Django 是什么 Django 是一个高级的 Web 框架&#xff0c…

从0开始用C写贪吃蛇(基于链表)

目录 1. 游戏背景 2. 游戏效果演示​编辑​编辑​编辑 3. 实现目标 4. 技术要点 5. 控制台程序 5.1 设置控制台窗口的长宽和名字 5.2 控制台屏幕上的坐标COORD 6.Win32 API 6.1 GetStdHandle 6.2 GetConsoleCursorInfo 6.3 CONSOLE_CURSOR_INFO 6.4 SetConsole…

Cgicc搭建交叉编译环境(移植到arm)

Cgicc GUN Project官网连接&#xff1a;Cgicc- GNU Project - Free Software Foundation 1. 下载源码 Cgicc下载地址&#xff1a; [via http] Index of /gnu/cgicc [via FTP] ftp://ftp.gnu.org/gnu/cgicc/ 目前最新版&#xff1a;3.2.20 2. 源码构建原理 一般&#xff…

【threejs教程9】threejs加载360全景图(VR)的两种方法

目录 前言 1.Equirectangular映射背景 实现步骤 1.初始化TextureLoader 2.加载Equirectangular纹理 3.配置映射类型和颜色空间 4.应用背景 完整代码如下 2.立方体贴图背景 实现步骤 1.创建CubeTextureLoader 2.加载立方体贴图 3.应用背景 完整代码如下 …

【网络安全】安全事件管理处置 — 事件分级分类

专栏文章索引&#xff1a;网络安全 有问题可私聊&#xff1a;QQ&#xff1a;3375119339 目录 一、安全事件分级 二、应急事件分级 三、安全事件分类 四、常见安全事件原因分析 1.web入侵 2.漏洞攻击 3.网络攻击 一、安全事件分级 在对安全事件的应急响应过程中&#xf…

跨平台获取音频设备处理

跨平台音频设备处理通常涉及到使用特定于平台的API或者跨平台的库来枚举和访问音频设备。以下是一些常见的方法来实现这一功能&#xff1a; 使用PortAudio库&#xff1a; PortAudio是一个跨平台的音频I/O库&#xff0c;它提供了统一的API来访问音频设备。使用PortAudio&#xf…

字符串漏洞注入深入学习

字符串型漏洞注入&#xff0c;特别是针对Web应用程序的SQL注入&#xff0c;是一种常见的网络安全威胁。它涉及攻击者在不受控制的情况下&#xff0c;通过构造特定的字符串输入&#xff0c;干扰或改变应用程序中原有的SQL查询语句&#xff0c;从而执行恶意的SQL代码。 要深入学…

矿山自动驾驶技术点分析

自动驾驶多用于乘用车领域&#xff0c;目前矿山自动驾驶量产落地前景广阔&#xff0c;由于矿山工作环境差&#xff0c;污染严重&#xff0c;而且通常矿区面积大&#xff0c;工作任务单一&#xff0c;场景固定&#xff0c;是一个适合进行自动驾驶落地的场景。 矿山自动驾驶俗称智…