为了账号安全,请及时绑定邮箱和手机立即绑定

树状图按值排序

树状图按值排序

慕码人2483693 2019-06-19 16:08:15
树状图按值排序我想要写一个比较器,它允许我按值对树状图进行排序,而不是默认的自然排序。我试过这样做,但找不出哪里出了问题:import java.util.*;class treeMap {     public static void main(String[] args) {         System.out.println("the main");         byValue cmp = new byValue();         Map<String, Integer> map = new TreeMap<String, Integer>(cmp);         map.put("de",10);         map.put("ab", 20);         map.put("a",5);         for (Map.Entry<String,Integer> pair: map.entrySet()) {             System.out.println(pair.getKey()+":"+pair.getValue());         }     }}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;         }     }}我想我要问的是:我能得到一个Map.Entry传递给比较国?
查看完整描述

3 回答

?
慕虎7371278

TA贡献1802条经验 获得超4个赞

在Java 8中:

LinkedHashMap<Integer, String> sortedMap = 
    map.entrySet().stream().
    sorted(Entry.comparingByValue()).
    collect(Collectors.toMap(Entry::getKey, Entry::getValue,
                             (e1, e2) -> e1, LinkedHashMap::new));


查看完整回答
反对 回复 2019-06-19
?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

你不能TreeMap本身对值进行排序,因为这违背了SortedMap规格:

Map这进一步提供了一个全序关于它钥匙.

但是,使用外部集合,您可以始终进行排序。Map.entrySet()但是,您可以通过键、值,甚至组合(!)两个人中的一个。

下面是一个返回SortedSetMap.Entry,给Map其价值是Comparable:

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<Map.Entry<K,V>>(
        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<String,Integer> map = new TreeMap<String,Integer>();
    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]"

注意,如果尝试修改SortedSet本身,或Map.Entry,因为这不再是原始地图的“视图”,比如entrySet()是。

一般来说,需要根据地图的值对条目进行排序是不典型的。


注:==Integer

您的原始比较器比较Integer使用==..这几乎总是错误的,因为==带着Integer操作数是引用相等,而不是值相等。

    System.out.println(new Integer(0) == new Integer(0)); // prints "false"!!!

相关问题


查看完整回答
反对 回复 2019-06-19
  • 3 回答
  • 0 关注
  • 862 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信