【问题标题】:Sort java map by value (which contains a set)按值排序java映射(包含一个集合)
【发布时间】:2015-04-26 09:44:51
【问题描述】:

我有一张看起来像的地图

Map<Word, Set<Word>> tupleMap = new HashMap<Word, Set<Word>>();

Word 类没有什么特别之处,它包含一些字符串,如value 等。我正在尝试按关联集的元素数量对该地图进行排序。因此,与它相关联的单词最多的单词将在地图中排在第一位/最后。

我确实设法使用此代码按其键对该地图进行排序:

WordMapComparator bvc = new WordMapComparator(tupleMap);
TreeMap<Word, Set<Word>> sortedTupleMap = new TreeMap<Word, Set<Word>>(bvc);
    sortedTupleMap.putAll(tupleMap); `

比较器在哪里

class WordMapComparator implements Comparator<Word> {

    Map<Word, Set<Word>> base;

    public WordMapComparator(Map<Word, Set<Word>> tupleMap) {
        this.base = tupleMap;
    }

    public int compare(Word a, Word b) {
        return a.getValue().compareTo(b.getValue());
    }
}

现在这工作得很好,所以地图会根据words 值进行排序。但是,我尝试了这个比较器:

class WordMapComparator implements Comparator<Word> {

    Map<Word, Set<Word>> base;

    public WordMapComparator(Map<Word, Set<Word>> tupleMap) {
        this.base = tupleMap;
    }

    public int compare(Word a, Word b) {
        return base.get(a).size() >= base.get(b).size() ? -1 : 1;
    }
}

并使用

测试生成的地图
    1. for(Word w : sortedTupleMap.keySet()){
    2.  System.out.print(w.getValue() + " : ");
    3.  for(Word wo : sortedTupleMap.get(w)){
    4.      System.out.print(wo.getValue() + " ");
    5.  }
    6.  System.out.println();
    7. }    

我在第 3 行得到一个 null pointer exception,基本上,结果 Set 为空。

为什么会发生这种情况,此外,如何解决?

谢谢一百万!

【问题讨论】:

    标签: java sorting dictionary


    【解决方案1】:
    return base.get(a).size() >= base.get(b).size() ? -1 : 1;
    

    这显然是错误的:如果单词数相同,它应该返回 0,而不是 1 或 -1,具体取决于 a 和 b 的比较方式。只需使用

    return Integer.compare(base.get(a).size(), base.get(b).size());
    

    然而,这会使地图认为所有具有相同数量关联词的词是相等的,因此您需要通过另一个标准来区分它们:

    int result = Integer.compare(base.get(a).size(), base.get(b).size());
    if (result == 0) {
        result = a.compareTo(b);
    }
    return result;
    

    【讨论】:

    • 太棒了!所以它不再给出 NPE,但是,当按键排序时,映射包含约 160 个元素。像这样排序后,地图只包含 12 个。知道为什么吗?
    猜你喜欢
    • 2014-06-13
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    • 2011-11-19
    • 1970-01-01
    • 2021-03-01
    • 2013-02-01
    相关资源
    最近更新 更多