本文主要是介绍仿redis的zset类型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前言
模仿redis的zset数据类型,写了Java内存版,写这个的背景是做自己的小项目,服务器资源有限,不想引入redis,但同时又想使用zset的排序功能,所以就自己写了一个简化版本。
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());}}}
}
这篇关于仿redis的zset类型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!