実際、キーは常にソートされています。マップを数回出力すると、結果は同じままであることがわかります。
最初に、ハッシュについてもう一度ゴシップします。
その理由はハッシングです。各オブジェクトにはhashCode()
メソッドがあります。ハッシュ空間は、可能なすべてのハッシュ値をインデックスとして含む大きな配列のようなものです。新しい要素が に挿入されるHashSet
か、新しいペアが に挿入されるHashMap
と、そのハッシュ コードに従ってハッシュ空間に配置されます。2 つの要素のハッシュ コードが同じequals()
場合、メソッドと比較され、等しくない場合、新しい要素がその隣に配置されます。
次に、そこで何が起こるかを知っていれば、以下のようなコードを実装できます。
import java.util.*;
class MyString {
private String str;
public MyString (String str) {
this.str = str;
}
public String toString () {
return str;
}
public boolean equals (Object obj) {
if (obj.getClass().equals(MyString.class)) {
return obj.toString().equals(str);
}
return false;
}
public int hashCode () {
if (str.equalsIgnoreCase("Not Categorized")) {
return Integer.MAX_VALUE;
} else if (str.hashCode() == Integer.MAX_VALUE) {
return 0;
}
return str.hashCode();
}
}
public class Test {
public static void main (String args[]) {
Map<MyString, String> m = new HashMap<MyString, String>();
m.put(new MyString("a"), "a");
m.put(new MyString("c"), "c");
m.put(new MyString("Not Categorized"), "NC");
m.put(new MyString("b"), "b");
Set<MyString> keys = m.keySet();
for (MyString k : keys) {
System.out.println(m.get(k));
}
}
}
その結果、「未分類」は常に最後に来ます。理由は簡単です。ハッシュ値は常に整数の最大値です。
String ラッパー クラスを作成する理由は、String クラスが最終的なものであり、拡張できないためです。したがって、この方法では、クラス構造が少し変更されますが、それほど大きくはなりません。
効率は劣りますが、TreeMap を使用することは可能です。
public static void main (String args[]) {
Map<String, String> m = new TreeMap<String, String>(new Comparator<String>() {
public int compare (String s1, String s2) {
if (s1.equals(s2)) {
return 0;
}
if (s1.equalsIgnoreCase("Not Categorized")) {
return 1;
}
if (s2.equalsIgnoreCase("Not Categorized")) {
return -1;
}
if (s1.hashCode() > s2.hashCode()) {
return 1;
} else if (s1.hashCode() < s2.hashCode()) {
return -1
} else {
return 0;
}
}
public boolean equals (Object obj) {
return false;
}
});
m.put("a", "a");
m.put("c", "c");
m.put("Not Categorized", "NC");
m.put("b", "b");
Set<String> keys = m.keySet();
for (String k : keys) {
System.out.println(m.get(k));
}
}
結果は同じです。すべての要素を並べ替えますが、他の文字列のハッシュ順序は変更しません。「分類されていない」が常に最大のものになるようにするだけです。