カスタム順序付けを使用してコレクションをソートするための Java コンパレーターを実装するための (時間とスペースの両方の効率の点で) 最良の方法は何ですか。たとえば、次の順序で配列を並べ替えたいとします。
RWQOJMVAHBSGZXNTCIEKUPDYFL
期待どおりに動作する次の Java コードがありますが、同じことを行う効率的な方法が他にあるかどうかはわかりません。
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.lang.Math;
public class DiffSort {
private static String order = "RWQOJMVAHBSGZXNTCIEKUPDYFL";
// sort with comparator
public static Comparator<String> diffNaturalOrder = new Comparator<String>() {
public int compare(String v, String w) {
int diff = 0, iter = 0;
Integer index1, index2;
Integer len1 = v.length();
Integer len2 = w.length();
int len = Math.min(len1, len2); // lesser of 2 strings
for(int i=0; i<len; i++) {
index1 = order.indexOf(v.charAt(i));
index2 = order.indexOf(w.charAt(i));
// if both chars are absent in order string, use natural ordering
if(index1 == -1 && index2 == -1)
diff = new Character(v.charAt(i)).compareTo(new Character(w.charAt(i)));
else if(index1 == -1 && index2 > 0)
diff = 1;
else if(index1 > 0 && index2 == -1)
diff = -1;
else
diff = index1.compareTo(index2);
// break if we found mismatch
if(diff != 0) break;
}
// return smaller string first in sort
if(diff == 0)
diff = len1.compareTo(len2);
return diff;
}
};
// test client
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("ABCE1!4");
list.add("ABCE1!7");
list.add("!SDF");
list.add("TRWESF!");
Collections.sort(list, DiffSort.diffNaturalOrder);
// print sorted array
for(String s:list)
System.out.println(s);
}
}
/* 出力 */
ABCE1!4
ABCE1!7
トルウェス!
!自衛隊