当前位置: 首页 > 面试题库 >

排序地图 根据值按降序排列

卢志强
2023-03-14
问题内容

我正在使用map接口从文件中读取,然后将其中的值存储为键值对。文件格式如下

 A 34
 B 25
 c 50

我将从该文件中读取数据并将其存储为键值对,然后将其显示给用户。我的要求是以这种格式显示结果

C 50
A 34
B 25

因此,我需要按值的降序对地图进行排序。这样我就可以将它们显示为我的结果..我已经阅读了有关此内容并找到了以下代码

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; // Special fix to preserve items with equal values
                }
            }
        );
        sortedEntries.addAll(map.entrySet());
        return sortedEntries;
    }

我希望这将按升序对值进行排序,我只想知道此方法是否正确,或者其他有效方法对我有帮助?


问题答案:

由于您可以有重复的值,因此根本不应该使用a Set。更改为aList并对其进行排序。您entriesSortedByValues将看起来像这样:

static <K,V extends Comparable<? super V>> 
            List<Entry<K, V>> entriesSortedByValues(Map<K,V> map) {

    List<Entry<K,V>> sortedEntries = new ArrayList<Entry<K,V>>(map.entrySet());

    Collections.sort(sortedEntries, 
            new Comparator<Entry<K,V>>() {
                @Override
                public int compare(Entry<K,V> e1, Entry<K,V> e2) {
                    return e2.getValue().compareTo(e1.getValue());
                }
            }
    );

    return sortedEntries;
}

注意:在您的示例输出中,值是递减的。 如果您希望它们升序,请e1.getValue().compareTo(e2.getValue())改用。

例:

public static void main(String args[]) {

    Map<String, Integer> map = new HashMap<String, Integer>();
    map.put("A", 34);
    map.put("B", 25);
    map.put("C", 50);
    map.put("D", 50); // "duplicate" value

    System.out.println(entriesSortedByValues(map));
}

输出:

[D=50, C=50, A=34, B=25]


 类似资料:
  • 我有一个HashMap与作为关键和一个值作为价值。 我的目标是通过降序值对Hashmap进行排序。应在

  • 问题内容: 我需要像TreeMap这样排序的地图,但按值排序。我的地图很大,所以我不能随时随地对我的地图进行排序。是否存在解决此问题的良好解决方案?也许存在外部罐子遇到这个? 问题答案: 有多种方法可以满足您的要求。正如您随后澄清的那样,您当前可能有重复的对象,也许您可​​以用第三方多重映射(Guava,Apache Commons Collections )替换您的对象,然后交换您的键和值- 即

  • 问题内容: 如何在如下所示的SQLAlchemy查询中使用ORDER BY ? 此查询有效,但以升序返回: 如果我尝试: 然后我得到:。 问题答案: 来自@ jpmc26的用法

  • 我们必须按降序对数组进行部分排序。 我知道d::partial_sort但它是按升序排列的。 http://en.cppreference.com/w/cpp/algorithm/partial_sort. 是他们的任何其他这样的功能,可以这样做,或任何快速算法这样做。

  • 问题内容: 我想在键和值上对地图进行排序。首先是关键,然后是价值。例如,这应该是结果; 有人对如何有效地实现这一目标有建议吗?我一直在看到人们使用TreeMap对键进行排序,但是我也需要值。 或者欢迎使用其他对键和值进行排序的方法。 问题答案:

  • 我很惊讶以前没有人问过这个特定的问题,但我真的没有在SO上或。 假设我有一个包含整数的随机numpy数组,例如: 但我希望解决方案按降序排序。 现在,我知道我总能做到: 但这最后一句话是否高效?它不创建一个按升序排列的副本,然后反转这个副本以得到按反转顺序排列的结果吗?如果情况确实如此,是否有一个有效的替代方案?看起来不像接受参数来更改排序操作中比较的符号,以获得相反的顺序。