我正在寻找一种可以根据给定整数对对象进行排序的数据结构。像这样:
Object Score
Object1 86
Object2 85
Object3 85
每个对象都是唯一的,但可以有重复的分数。试图设计一种方法来说明 Map 对象如何执行此操作,但无法弄清楚。
结构可以在插入期间/之后对对象进行排序,或者当我隐式调用排序时。
是否已经有一个结构可以做到这一点?还是我应该自己编码?
最佳答案
如果您想要唯一值,请尝试将对象放在 SortedSet
中;如果您想要查看重复项,请尝试将对象放在 List
中,以及自定义 Comparator
根据他们的“分数”对他们进行排序。
提供您自己的比较器将允许您指定对象应该根据它们的 score
字段排序以及如何排序。
比较器也是可重复使用的,如果您愿意,可以轻松换入/换出,比如对项目进行降序排序。
举个例子:
class ScoreComparator implements Comparator <ObjectHolder> {
@Override
public int compare(ObjectHolder o1, ObjectHolder o2) {
return o1.getScore().compareTo(o2.getScore());
}
}
class DescendingScoreComparator implements Comparator <ObjectHolder> {
@Override
public int compare(ObjectHolder o1, ObjectHolder o2) {
return o2.getScore().compareTo(o1.getScore());
}
}
class ObjectHolder {
Object obj;
Integer score;
public ObjectHolder(Object o, Integer score) {
this.obj = o;
this.score = score;
}
public Object getObject() {
return obj;
}
public Integer getScore() {
return score;
}
}
public void showExample() {
SortedSet<ObjectHolder> sortedSet = new TreeSet<ObjectHolder>(new ScoreComparator());
sortedSet.add(new ObjectHolder("addedFirst", 55));
sortedSet.add(new ObjectHolder("addedSecond", 25));
sortedSet.add(new ObjectHolder("addedThird", 75));
sortedSet.add(new ObjectHolder("addedFourth", 25));
sortedSet.add(new ObjectHolder("addedFifth", 95));
// The resulting set will only have 4 items since sets don't allow duplicates
for (ObjectHolder holder : sortedSet) {
System.out.println(holder.getScore());
}
List<ObjectHolder> list = new LinkedList<ObjectHolder>();
list.add(new ObjectHolder("addedFirst", 55));
list.add(new ObjectHolder("addedSecond", 25));
list.add(new ObjectHolder("addedThird", 75));
list.add(new ObjectHolder("addedFourth", 25));
list.add(new ObjectHolder("addedFifth", 95));
Collections.sort(list, new ScoreComparator());
// The resulting set will only have 5 items since lists allow duplicates
System.out.println();
for (ObjectHolder holder : list) {
System.out.println(holder.getScore());
}
Collections.sort(list, new DescendingScoreComparator());
System.out.println("\nWill print 5 items, but this time in descending order");
for (ObjectHolder holder : list) {
System.out.println(holder.getScore());
}
}
下面是上面代码的输出:
Will print 4 unique items since sets don't allow duplicates
25 55 75 95
Will print 5 items since lists do allow duplicates
25 25 55 75 95
Will print 5 items, but this time in descending order
95 75 55 25 25
关于java - 对对象进行排序的数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8946104/