按值对 TreeMap 进行排序
TreeMap 是一个排序映射,其中键按自然顺序升序排序。如果需要根据值进行自定义排序,则需要使用评估值的比较器。
实现此类比较器的一次尝试可能如下所示:
class byValue implements Comparator<Map.Entry<String, Integer>> { public int compare(Map.Entry<String, Integer> e1, Map.Entry<String, Integer> e2) { if (e1.getValue() < e2.getValue()) { return 1; } else if (e1.getValue() == e2.getValue()) { return 0; } else { return -1; } } }
然而,这种方法是有缺陷的,因为 TreeMap 不能仅根据值进行排序。它旨在对其键进行排序,而不是与这些键关联的值。
替代解决方案:排序 Map.Entry
要克服此限制,可以使用外部集合用于对 Map.entrySet() 集合进行排序。该排序集允许根据值进行过滤和排序。下面是一个按值对 Map.entrySet() 进行排序的通用方法:
static <K, V extends Comparable<? super V>> SortedSet<Map.Entry<K, V>> entriesSortedByValues(Map<K, V> map) { SortedSet<Map.Entry<K, V>> sortedEntries = new TreeSet<>( new Comparator<Map.Entry<K, V>>() { @Override public int compare(Map.Entry<K, V> e1, Map.Entry<K, V> e2) { int res = e1.getValue().compareTo(e2.getValue()); return res != 0 ? res : 1; } } ); sortedEntries.addAll(map.entrySet()); return sortedEntries; }
使用此方法,可以根据值获取经过排序的 Map.Entries 集合,如下所示:
Map<String, Integer> map = new TreeMap<>(); map.put("A", 3); map.put("B", 2); map.put("C", 1); System.out.println(map); // prints "{A=3, B=2, C=1}" System.out.println(entriesSortedByValues(map)); // prints "[C=1, B=2, A=3]"
整数相等的注意事项
值得请注意,提供的代码使用 == 来比较整数值。通常不建议这样做,因为它检查引用相等性,而不是值相等性。在某些情况下,可能会导致意想不到的结果。最好使用compareTo()之类的方法来进行值比较。
以上是如何按值而不是键对 TreeMap 进行排序?的详细内容。更多信息请关注PHP中文网其他相关文章!