首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >评分项目的SortedSet

评分项目的SortedSet
EN

Code Review用户
提问于 2014-08-19 09:52:27
回答 1查看 520关注 0票数 5

我想返回一组附加分数的项目给用户,这样用户就可以轻松地从最高到最低的迭代,并得到第n最高的项目。

问题

  • JavaDoc of SortedSet.first()表示“返回当前集合中的第一个(最低)元素”。然而,在这种情况下,它实际上是最高的分数。但是,如果我将相反的情况进行比较,用户需要反转SortedSet以完成这个常见的用例。
  • 如果我只按分数进行比较,SortedSet只能有一个得分相同的项目。然而,用c来比较,我觉得有些武断(不知道我能做些什么来反对它)。
  • 具有相同URI的两个项不应该存在,但是,当它们有不同的分数时,就不会被阻止。
代码语言:javascript
复制
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();
    }
}
EN

回答 1

Code Review用户

回答已采纳

发布于 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排序项,方法是像这样构造它:

代码语言:javascript
复制
SortedSet<Item<String>> items = new TreeSet<>(Collections.reverseOrder());

如果我只按分数进行比较,SortedSet只能有一个得分相同的项目。然而,用c来比较,我觉得有些武断(不知道我能做些什么来反对它)。

我不知道你这么说是什么意思。由于c是一个字符串,默认情况下比较将是字母顺序的。

我推荐这种写作风格(我还重命名了变量):

代码语言:javascript
复制
@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;
}
票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/60455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档