【问题标题】:How to sort out a TreeMap<String, Integer>?如何整理 TreeMap<String, Integer>?
【发布时间】:2013-01-16 19:28:05
【问题描述】:

我有一张地图:TreeMap&lt;String, Integer&gt; m = new TreeMap&lt;&gt;();,其中有一个完整的字母表和值,它显示了每个字母在我的文本中出现的次数。

我想按降序对该地图进行排序;即出现频率最高的字母在第一行,输出的最后一行表示出现频率最低的字母。 如果两个字母出现频率相同,那么字母表中排在第一位的字母必须在最前面。 如何做到?

我尝试了比较器:

public int compare(String a, String b) {
        if (base.get(a) >= base.get(b) && a.compareToIgnoreCase(b) < 0) {
            return -1;
        } else {
            return 1;
        }
    }

但仍然不是,输出是:

D 3
E 3
A 2
S 5

伙计们......以前发现过这个,这根本没有帮助。好的输出应该是:

S 5
D 3
E 3
A 2

【问题讨论】:

标签: java treemap


【解决方案1】:

您的比较器看起来不正确 - 这应该会更好:

public int compare(String a, String b) {
    if (base.get(a) > base.get(b)) {
        return -1;
    } else if (base.get(a) < base.get(b)) {
        return 1;
    } else {
        int stringCompare = a.compareToIgnoreCase(b);
        return stringCompare == 0 ? 1 : stringCompare; // returning 0 would merge keys
    }
}

【讨论】:

  • @Katie 抱歉,它是按升序排列的 - 已修改。
【解决方案2】:

由于自然排序与您的排序愿望没有任何共同之处:

List<Map.Entry<String, Integer>> entries = new ArrayList<>(m.entrieSet());

Collections.sort(entries, new Comparator<Map.Entry<String, Integer>>() {
    @Override
    public int compare(Map.Entry<String, Integer >a, Map.Entry<String, Integer>b) {
        if (a.getValue() < b.getValue()) { // Descending values
            return 1;
        } else if (a.getValue() > b.getValue()) {
            return -1;
        }
        return -a.getKey().compareTo(b.getKey()); // Descending keys
    }    
});

【讨论】:

  • +1。像 OP 那样尝试按值编写比较器是一个非常糟糕的主意,并且会使您的代码陷入混乱、令人惊讶和无法调试的混乱局面。
猜你喜欢
  • 1970-01-01
  • 2012-11-30
  • 1970-01-01
  • 2014-02-02
  • 1970-01-01
  • 1970-01-01
  • 2021-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多