树状图按值排序

树状图按值排序

我想要写一个比较器,它允许我按值对树状图进行排序,而不是默认的自然排序。

我试过这样做,但找不出哪里出了问题:

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传递给比较国?


慕码人2483693
浏览 863回答 3
3回答

慕虎7371278

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

有只小跳蛙

你不能TreeMap本身对值进行排序,因为这违背了SortedMap规格:A&nbsp;Map这进一步提供了一个全序关于它钥匙.但是,使用外部集合,您可以始终进行排序。Map.entrySet()但是,您可以通过键、值,甚至组合(!)两个人中的一个。下面是一个返回SortedSet的Map.Entry,给Map其价值是Comparable:static&nbsp;<K,V&nbsp;extends&nbsp;Comparable<?&nbsp;super&nbsp;V>>SortedSet<Map.Entry<K,V>>&nbsp;entriesSortedByValues(Map<K,V>&nbsp;map)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;SortedSet<Map.Entry<K,V>>&nbsp;sortedEntries&nbsp;=&nbsp;new&nbsp;TreeSet<Map.Entry<K,V>>( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;Comparator<Map.Entry<K,V>>()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override&nbsp;public&nbsp;int&nbsp;compare(Map.Entry<K,V>&nbsp;e1,&nbsp;Map.Entry<K,V>&nbsp;e2)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;res&nbsp;=&nbsp;e1.getValue().compareTo(e2.getValue()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;res&nbsp;!=&nbsp;0&nbsp;?&nbsp;res&nbsp;:&nbsp;1; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;); &nbsp;&nbsp;&nbsp;&nbsp;sortedEntries.addAll(map.entrySet()); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;sortedEntries;}现在您可以执行以下操作:&nbsp;&nbsp;&nbsp;&nbsp;Map<String,Integer>&nbsp;map&nbsp;=&nbsp;new&nbsp;TreeMap<String,Integer>(); &nbsp;&nbsp;&nbsp;&nbsp;map.put("A",&nbsp;3); &nbsp;&nbsp;&nbsp;&nbsp;map.put("B",&nbsp;2); &nbsp;&nbsp;&nbsp;&nbsp;map.put("C",&nbsp;1);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;System.out.println(map); &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;prints&nbsp;"{A=3,&nbsp;B=2,&nbsp;C=1}" &nbsp;&nbsp;&nbsp;&nbsp;System.out.println(entriesSortedByValues(map)); &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;prints&nbsp;"[C=1,&nbsp;B=2,&nbsp;A=3]"注意,如果尝试修改SortedSet本身,或Map.Entry,因为这不再是原始地图的“视图”,比如entrySet()是。一般来说,需要根据地图的值对条目进行排序是不典型的。注:==为Integer您的原始比较器比较Integer使用==..这几乎总是错误的,因为==带着Integer操作数是引用相等,而不是值相等。&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(new&nbsp;Integer(0)&nbsp;==&nbsp;new&nbsp;Integer(0));&nbsp;//&nbsp;prints&nbsp;"false"!!!相关问题在Java中比较两个整数时,会发生自动取消装箱吗?(不!)它能保证new Integer(i) == i在爪哇?(是的!)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java