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

Java 对排序为值的对象使用Set或Map,java,collections,map,set,Java,Collections,Map,Set,编辑功能的更详细说明: 我有一个HashSet,其中填充了一个名为Symbol的特定对象。特定函数迭代所有符号s。该函数指定每个符号的能源成本,并返回该值。我想制作一个新的集合/映射,并将符号保存在其中,按此能源成本排序。 下一个算法获取能量消耗最大的符号,并将其放入另一个列表,该列表在能量消耗的情况下受到限制。当此列表已满时,算法结束 我应该使用什么来节省能源成本和符号?我应该能够得到能源成本和符号 我想到了一个SortedMap,然后通过guava.collection订购,如下所示: 但

编辑功能的更详细说明:

我有一个
HashSet
,其中填充了一个名为
Symbol
的特定对象。特定函数迭代所有
符号
s。该函数指定每个
符号的能源成本,并返回该值。我想制作一个新的
集合
/
映射
,并将
符号
保存在其中,按此能源成本排序。 下一个算法获取能量消耗最大的
符号
,并将其放入另一个
列表
,该列表在能量消耗的情况下受到限制。当此
列表
已满时,算法结束

我应该使用什么来节省能源成本和
符号
?我应该能够得到能源成本和
符号

我想到了一个
SortedMap
,然后通过
guava.collection
订购,如下所示:


但我不知道这是不是最好的解决方案?也许设置一个
集合
会更好地解决此类问题?

如果我已经理解了您想要做什么,那么您需要的是:

  • 确保符号类实现了可比较的接口
  • 使用SortedSet(TreeSet)代替集合(HashSet)

如果一个集合满足了您的需要,不要更改为地图,保持简单;)。当您需要随机访问时,映射非常有用。

如果您想提取每个步骤的最大值,您应该查看堆数据结构。 在Java集合中,实现堆的类是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;
        }
    }
});
PriorityQueue pq=new PriorityQueue(0,new Comparator(){
@凌驾
公共整数比较(符号s1、符号s2){
if(s1.getLong()s2.getLong()){
返回-1;
}否则{
返回0;
}
}
});
看看比较器是如何工作的。如果s1小于s2,它应该返回-1,但PriorityQueue提取的是最小值,而不是最大值,因此我们颠倒了这种行为。
当然,如果您只想对数据进行一次迭代,而不在数据中插入任何内容,保持数据的最大值,那么@Pablo answer更好。