
1)RankItem.java
package org.example.testtreeset;
public class RankItem {
private String name;
private int score;
private int rid;
public RankItem(String name, int score, int rid) {
this.name = name;
this.score = score;
this.rid = rid;
}
@Override
public String toString() {
return "RankItem{" +
"name='" + name + ''' +
", score=" + score +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public int getRid() {
return rid;
}
public void setRid(int rid) {
this.rid = rid;
}
}
2)RankService.java
package org.example.testtreeset;
import java.util.Comparator;
import java.util.TreeSet;
public class RankService {
private static TreeSet ts = new TreeSet<>(new Comparator() {
@Override
public int compare(RankItem o1, RankItem o2) {
int diffScore = o1.getScore() - o2.getScore();
int diffRid = o1.getRid() - o2.getRid();
return diffScore == 0 ? diffRid : diffScore;
}
});
public static void addRankItem(RankItem item) {
ts.add(item);
}
public static void showRankInfo() {
for (RankItem item : ts) {
System.out.println(item);
}
}
}
3)Main.java
package org.example.testtreeset;
public class Main {
public static void main(String[] args) {
RankItem item = new RankItem("xx", 60, 1);
RankItem item1 = new RankItem("jn", 100, 2);
RankItem item2 = new RankItem("cx", 60, 3);
RankItem item3 = new RankItem("a", 80, 4);
RankService.addRankItem(item);
RankService.addRankItem(item1);
RankService.addRankItem(item2);
RankService.addRankItem(item3);
RankService.showRankInfo();
}
}
总结:
可以看出Java中TreeSet的特性和redis中的有序集合是类似的,但是redis中的有序集合只能指定一个score字段,因此对于相同socre的,我们只能用socre的高几位和低几位来表示2个意思,拼起来为一个完成 的数字。
Treeset则需要自己实现比较函数,当score相同时,我们可以使用某个唯一的编号如:rid 进行排序即可。