我有这样的地图:
Map<List<Item>, Double> items = new HashMap<List<Item>, Double>();
我想根据List<Item>
最大的散列图的大小对散列图进行排序。我不在乎相同大小的对象中的顺序。
到目前为止,我已经尝试使用TreeSet
like这样的方式:
SortedSet<Map.Entry<List<Item>, Double>> sortedItems = new TreeSet<Map.Entry<List<Item>, Double>>(
new Comparator<Map.Entry<List<Item>, Double>>() {
@Override
public int compare(
Entry<List<Item>, Double> o1,
Entry<List<Item>, Double> o2) {
return o2.getKey().size() - o1.getKey().size();
}
});
sortedItems.addAll(items.entrySet());
但是,sortedItems
对象仅采用每个大小列表中的一个。它会将大小相等的列表视为重复列表,并忽略它们。我该如何解决此问题。
编辑:所以据我所知,当比较2个相同大小的列表时,我的compare
方法正在返回0
。这告诉集合条目是相等的,它们被视为重复项。因此,我想解决此问题的唯一方法是确保compare方法永远不会返回0
。所以我写了这段代码:
@Override
public int compare(
Entry<List<AuctionItem>, Double> o1,
Entry<List<AuctionItem>, Double> o2) {
if (o1.getKey().size() <= o2.getKey().size()) {
return -1;
} else {
return 1;
}
}
如果您尝试将商品放入TreeSet
自定义Comparator
返回0
的商品中,则该商品将不会放入Set
。
您必须使用Comparator
不会返回的0
。对于List
(胡)的大小都是平等的,你必须定义一个一致的,任意的命令。
这是一种简便的方法:
new Comparator<Map.Entry<List<Item>, Double>>() {
@Override
public int compare(Entry<List<Item>, Double> o1,
Entry<List<Item>, Double> o2) {
int diff = o2.getKey().size() - o1.getKey().size();
return diff != 0 ? diff :
System.identityHashCode(o2.getKey()) -
System.identityHashCode(o1.getKey());
}
};
基本上,我要做的是:如果2个列表的大小不同,size2 - size1
则可以。如果它们具有相同的大小,我将返回它们的身份哈希码的差异,该差异将总是与之不同,0
因为身份哈希码是对于不同对象而言是不同的内存地址。而且对于一个对象它始终是相同的,因此比较器对于2个具有相同大小的列表将始终返回相同的顺序。
使用此比较器,您将获得一个排序集合,该列表允许具有相同大小的列表,并且将按列表大小对其进行排序。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句