我有一张看起来像这样的 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/