Каков наилучший (с точки зрения эффективности времени и пространства) способ реализации Java-компаратора для сортировки коллекций с использованием пользовательского заказа. Например - я хочу, чтобы отсортировать массив, используя следующий порядок -Индивидуальный заказ на 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
TRWESF!
! SDF
Я не думаю, что вы код всегда будет сортировать ABC и ABCDEF правильно, потому что он игнорирует DEF и говорит, что они равны. –
В стороне, нет такой вещи, как «обычай естественного упорядочения». Естественное упорядочение - это то, что вы получаете без какого-либо специального компаратора. –
«RWQOJMVAHBSGZXNTCIEKUPDYFL» - это не естественный порядок! Это индивидуальный заказ. И, как сказал Том Г, нет никакого естественного порядка! – AlexWien