使用Set或Map为对象排序到值Java

时间:2014-06-23 08:10:15

标签: java collections map set

编辑更详细的功能说明:

我有HashSet填充了名为Symbol的特定对象。特定函数遍历所有Symbol。该函数指定每个Symbol的能源成本并返回此值。我想制作一个新的Set / Map并将Symbol保存在其中,按此能源费用排序。 下一个算法将Symbol的能量成本降低,并将其放入另一个List,这在能源成本的情况下是有限的。当此List已满时,算法结束。

我应该使用什么来节省能源成本和Symbol?我应该能够获得能源成本和Symbol

我想到了一个SortedMap并通过guava.collection点这里订购:

https://stackoverflow.com/a/3420912

但我不知道这是否是最佳解决方案?也许Set会更好地解决这类问题吗?

2 个答案:

答案 0 :(得分:0)

如果我明白你想做什么,你需要的是:

  • 确保您的Symbol类实现Comparable接口。
  • 而是Set(HashSet),使用SortedSet(TreeSet)。

如果Set满足您的需要,请不要更改为Map,保持简单;)。当您需要随机访问时,地图非常有用。

答案 1 :(得分:0)

如果要在每个步骤中提取最大值,则应查看堆数据结构。 在Java Collections类中,实现堆是PriorityQueue 如果要提取最大值,则应该为构造函数提供自己的比较器,如下所示:

PriorityQueue<Symbol> pq = new PriorityQueue<Symbol>(0, new Comparator<Symbol>(){     
    @Override
    public int compare(Symbol s1, Symbol s2) {
        if (s1.getLong() < s2.getLong()) {
             return 1;
        } else if (s1.getLong() > s2.getLong()) {
             return -1;
        } else {
             return 0;
        }
    }
});

看看比较器是如何工作的。如果s1小于s2,它应返回-1,但PriorityQueue提取最小值,而不是最大值,因此我们反转此行为。
当然,如果您只想迭代一次数据并且不要在其中插入任何内容,那么@Pablo答案会更好。