Map<String, Integer>
値でソートする方法を探していました。この投稿を見つけて、並べ替えの問題を解決しましたが、正確ではありませんでした。投稿によると、次のコードを書きました。
import java.util.*;
public class Sort {
static class ValueComparator implements Comparator<String> {
Map<String, Integer> base;
ValueComparator(Map<String, Integer> base) {
this.base = base;
}
@Override
public int compare(String a, String b) {
if (base.get(a) >= base.get(b)) {
return 1;
} else {
return -1;
}
}
}
public static void main(String[] args) {
HashMap<String, Integer> map = new HashMap<String, Integer>();
ValueComparator vc = new ValueComparator(map);
TreeMap<String, Integer> sorted = new TreeMap<String, Integer>(vc);
map.put("A", 1);
map.put("B", 2);
sorted.putAll(map);
for (String key : sorted.keySet()) {
System.out.println(key + " : " + sorted.get(key)); // why null values here?
}
System.out.println(sorted.values()); // But we do have non-null values here!
}
}
出力:
A : null
B : null
[1, 2]
BUILD SUCCESSFUL (total time: 0 seconds)
出力からわかるように、このget
メソッドは常に を返しますnull
。その理由は、私のValueComparator.compare()
メソッドが決して返らないためです。これは、この投稿0
を作成することでわかりました。
null
値の問題を解決するために、誰かがその投稿で次のことを提案しました。
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 0;
}
return -1;
}
このコードをテストしたところ、キーのマージの問題が発生しました。つまり、値が等しい場合、対応するキーがマージされます。
私も次のことを試しました:
public int compare(String a, String b) {
if (a.equals(b)) return 0;
if (base.get(a) >= base.get(b)) {
return 1;
} else return -1;
}
どちらも機能しません。一部の値はまだnull
. さらに、この回避策には論理的な問題が発生する可能性があります。
誰でも私の問題に対して完全に機能する解決策を提案できますか? 値による並べ替え機能とget
メソッドが同時に機能することを望みます。