いくつかのルールに従ってコンテンツを並べ替えたいマップがあります。
- キーではなく値に従って、マップをアルファベット順 (A から Z) に並べ替えます。
- 値を並べ替えるときに、値の大文字と小文字の区別を無視します。
- 重複する単語を考慮に入れます(スペルと大文字と小文字が完全に一致する単語)。
- 英数字の単語を右に並べ替えます ( Cbc2eeはCbc100eeの前に表示する必要があります)。
- 英語以外の単語を処理します ( áreaは "a" の文字で始まる単語に表示されるはずですが、実際には "z" の文字で始まる単語の後に表示されます。これは á の別の文字を考慮します)。
私が欲しいのはすべて論理的だと思います。このコードでポイント1、2、3を達成できました:
public <K, V extends Comparable<? super V>> LinkedHashMap<K, V> sortMapByValues( Map<K, V> map ) {
SortedSet<Map.Entry<K, V>> sortedEntries = new TreeSet<Map.Entry<K, V>>(
new Comparator<Map.Entry<K, V>>() {
@Override
public int compare( Map.Entry<K, V> e1, Map.Entry<K, V> e2 ) {
String a = (String)e1.getValue();
String b = (String)e2.getValue();
int diff = a.compareToIgnoreCase( b );
if (diff == 0)
diff = a.compareTo(b);
return diff != 0 ? diff : 1; // Special fix to preserve words with similar spelling.
}
}
);
sortedEntries.addAll( map.entrySet() );
LinkedHashMap<K, V> sortedMap = new LinkedHashMap<K, V>();
for( Map.Entry<K, V> sortedEntry : sortedEntries )
sortedMap.put( sortedEntry.getKey(), sortedEntry.getValue() );
return sortedMap;
}
ポイント(4)スクリプトを見つけましたが、コードとマージできませんでした: http://www.davekoelle.com/alphanum.html
ポイント(5)もスクリプトを見つけましたが、コードとマージできませんでした: http://www.javapractices.com/topic/TopicAction.do?Id=207
これらの点は、compare(...) メソッドに影響するためです。 誰でもそれで私を助けることができますか?