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更好。