Сортировка ArrayList <String> с пользовательским компаратором

1

Я пытаюсь сортировать 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]

Пожалуйста, дайте мне знать, как действовать. Заранее спасибо.

Теги:
arraylist
sorting
collections
comparator

2 ответа

2
Лучший ответ

Используйте эту реализацию компаратора:

@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. [...]

  • 0
    поздравляю, ваше решение действительно только одно
  • 0
    @nikis Спасибо, я привык к таким компараторам, потому что мой работодатель часто спрашивает о экзотических и слишком сложных стратегиях сравнения, это здесь просто очень упрощено ;-)
1

Краткое описание метода:

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);
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню