java - 按值对java映射进行排序(包含一个集合)

标签 java sorting dictionary

我有一张看起来像这样的 map

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

Word类没什么特别的,它包含一些字符串,例如 value等等。我正在尝试按关联集合的元素数量对该映射进行排序。因此,与其关联的单词最多的单词将位于 map 中的第一个/最后一个。

我确实设法使用以下代码按键对这张 map 进行排序:

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());
    }
}

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

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;
    }
}

并使用以下命令测试生成的 map

    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. }    

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

为什么会发生这种情况,而且如何解决这个问题?

感谢一百万!

最佳答案

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());

但是,这将使 map 将具有相同数量关联词的所有词视为相等,因此您需要通过另一个标准来区分它们:

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

关于java - 按值对java映射进行排序(包含一个集合),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29876038/

相关文章:

java - 打印数字三角形 - 两个正方形

java - 以编程方式调整线性布局的高度

java - 如何在 PySpark 中启用公平调度程序?

java - 无法从Java程序中调用外部可执行文件令人困惑

sorting - sort.Slice排序不正确

scala - 如何在Spark Scala中对具有5个元素的元组的RDD进行排序?

javascript - react 练习 : two arrays rendered by two children and displayed next to each other (Matching indexes) in parent

Python 3 按其值对字典进行排序

ios - 如何从嵌套数组/字典 iOS 7 中获取值

c - 想了解有关算法相关主题的信息网站或 Material