Я пытаюсь сортировать ArrayList<String>
с помощью пользовательского Comparator
. Мое требование состоит в том, что XX
String должна быть первой строкой, другие должны следовать естественному порядку.
Мне нужно: [XX, XX, 1, 5, 9, A, D, G, Q, Z]
Я получаю [1, 5, 9, A, D, G, Q, Z, XX, XX]
Ниже приведен мой код:
public class Test {
public static void main(String[] args)
{
List<String> list = new ArrayList<String>();
list.add("Z");
list.add("5");
list.add("D");
list.add("G");
list.add("XX");
list.add("9");
list.add("Q");
list.add("XX");
list.add("1");
list.add("A");
Collections.sort(list, new CustomComparator());
System.out.println(list);
}
}
class CustomComparator implements Comparator<String>
{
@Override
public int compare(String o1, String o2) {
if(o2.equals("XX")) {
return -1;
}
return o1.compareTo(o2);
}
}
EDIT: если я меняю логику компаратора на:
@Override
public int compare(String o1, String o2) {
if(o2.equals("XX")) {
return 1;
}
return o1.compareTo(o2);
}
Я осознаю:
[1, XX, 9, A, Q, XX, 5, D, G, Z]
Пожалуйста, дайте мне знать, как действовать. Заранее спасибо.
Используйте эту реализацию компаратора:
@Override
public int compare(String o1, String o2) {
if(o2.equals("XX")) {
return o1.equals("XX") ? 0 : 1;
} else if (o1.equals("XX")) {
return -1;
}
return o1.compareTo(o2);
}
Причина. Помимо вопроса, когда использовать -1 или 1, важно гарантировать четкий порядок для всех возможных кортежей o1 и o2, см. Javadoc:
[...] Разработчик должен убедиться, что sgn (compare (x, y)) == -sgn (ср. (Y, x)) для всех x и y. (Это означает, что compare (x, y) должен генерировать исключение тогда и только тогда, когда compare (y, x) генерирует исключение).
Разработчик должен также гарантировать, что отношение транзитивно: ((compare (x, y)> 0) && (compare (y, z)> 0)) подразумевает сравнение (x, z)> 0. [...]
Краткое описание метода:
public int compare(String o1, String o2) {
if (o1.equals(o2)) return 0;
if (o1.equals("XX")) return -1;
return (o2.equals("XX")) ? 1 : o1.compareTo(o2);
}