我想返回一组附加分数的项目给用户,这样用户就可以轻松地从最高到最低的迭代,并得到第n最高的项目。
SortedSet.first()表示“返回当前集合中的第一个(最低)元素”。然而,在这种情况下,它实际上是最高的分数。但是,如果我将相反的情况进行比较,用户需要反转SortedSet以完成这个常见的用例。SortedSet只能有一个得分相同的项目。然而,用c来比较,我觉得有些武断(不知道我能做些什么来反对它)。import java.util.SortedSet;
import java.util.TreeSet;
public class Main
{
static class Item<T extends Comparable<T>> implements Comparable<Item<T>>
{
double score;
T c;
public Item(double score, T c)
{
this.score=score;
this.c=c;
}
@Override public int compareTo(Item<T> i)
{
int x = -Double.compare(score, i.score);
if(x==0) {x=c.<T>compareTo(i.c);}
return x;
}
}
public static SortedSet<Item<String>> findItems()
{
SortedSet<Item<String>> items = new TreeSet<>();
items.add(new Item<String>(0.3,"honey"));
items.add(new Item<String>(0.7,"wolf"));
items.add(new Item<String>(0.5,"monitor"));
return items;
}
public static void main(String[] args)
{
// iterate from best to lowest score
for(Item item: findItems()) {}
// get item with best score
findItems().first();
}
}发布于 2014-08-19 15:57:53
JavaDoc of SortedSet.first()表示“返回当前集合中的第一个(最低)元素”。然而,在这种情况下,它实际上是最高的分数。
最低和最高的定义由比较器确定。如果在排序集中放置整数,则第一个元素将是最低的,因为将使用默认的比较器。然而,在Item对象中,对于越低越高的定义有不同的定义:
@重写公共int compareTo(Item i) { int x=-Double.compare(得分,i.score);if(x==0) {x=c.compareTo(i.c);}返回x;}
您的元素仍然按照您的比较方法从最低到最高的顺序排列:实际上您定义的0.7低于0.3,仅此而已。正如您注意到的,如果您删除int x = -Double.compare(score, i.score);中的负号,您就可以有效地切换顺序。
但是,如果我将相反的情况进行比较,用户需要反转SortedSet以完成这个常见的用例。
我想知道您是否知道.last()方法。看来这就是你要找的。
顺便说一句,您还可以按反向顺序排列一个TreeSet排序项,方法是像这样构造它:
SortedSet<Item<String>> items = new TreeSet<>(Collections.reverseOrder());如果我只按分数进行比较,SortedSet只能有一个得分相同的项目。然而,用c来比较,我觉得有些武断(不知道我能做些什么来反对它)。
我不知道你这么说是什么意思。由于c是一个字符串,默认情况下比较将是字母顺序的。
我推荐这种写作风格(我还重命名了变量):
@Override
public int compareTo(Item<T> item) {
int cmp = -Double.compare(score, item.score);
if (cmp == 0) {
return c.<T>compareTo(item.c);
}
return cmp;
}https://codereview.stackexchange.com/questions/60455
复制相似问题