Как написать компаратор для сравнения всех элементов списка с входом и перехода наверх

У меня есть список

List<String> myList = Arrays.asList("1234", "1214", "1334");

Мой вклад:

String mInput = "1214"

Как написать компаратор для сравнения всех элементов myList с mInput и, если он равен, переместить его в начало списка

Компаратор должен просто сравнивать, а не перемещать вещи. Вы уверены, что хотите это сделать?

Federico klez Culloca 16.03.2018 12:03

Хм 20к реп и довольно новичок вопрос - что тут творится? Это ЛОВУШКА?

Antoniossss 16.03.2018 12:04

@FedericoklezCulloca .... я могу сортировать с помощью comparator, возможно ли добиться этого, о чем идет речь

Devrath 16.03.2018 12:04

Возможный дубликат Сортировка строк, содержащих число в Java

Micha Wiedenmann 16.03.2018 12:07
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
287
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вам не нужен компаратор, который вы можете использовать:

List<String> myList = new ArrayList<>(Arrays.asList("1234", "1214", "1334"));
String mInput = "1214";
if (myList.contains(mInput)) {
    myList.remove(mInput);// remove mInput 
    myList.add(0, mInput);// add it to to index 0 (top of list)
}
System.out.println(myList);// Input [1214, 1234, 1334]

Обратите внимание, что вы должны использовать new ArrayList<>(Arrays.asList("1234", "1214", "1334")), чтобы понять, почему, вы можете прочитать этот UnsupportedOperationException при попытке удалить из списка, возвращаемого Array.asList

Спасибо, это тоже помогает ... [+1]

Devrath 16.03.2018 12:33

Если вам действительно нужен компаратор, вы можете сделать что-то вроде этого (при условии, что mInput не null):
myList.sort((String o1, String o2) -> mInput.equals(o1) && !mInput.equals(o2) ? -1 : o1.compareTo(o2));

Это нарушает договор компаратора. если o1 и o2 равны myInput, у вас есть o1 <o2 и o2 <o1.

JB Nizet 16.03.2018 12:16

В этом случае компаратор вернет -1, так в чем проблема?

Lennier 16.03.2018 12:17

Как я только что сказал, у вас будут и o1 <o2, и o2 <o1, в зависимости от того, используете ли вы o1.compareTo (o2) или o2.compareTo (o1). Это неверно.

JB Nizet 16.03.2018 12:18

Надеюсь, я исправил это

Lennier 16.03.2018 12:21
Ответ принят как подходящий

Вы можете написать свой собственный Comparator:

class BringToFrontComparator<T extends Comparable<T>> implements Comparator<T> {
    T front;

    public BringToFrontComparator(T front) {
        this.front = front;
    }

    @Override
    public int compare(T o1, T o2) {
        return o1.equals(front) && !o2.equals(front)
                // Front one is always less than anything other than itself.
                ? -1
                // Normal comparison elsewhere.
                : o1.compareTo(o2);
    }
}

public void test(String[] args) throws Exception {
    List<String> myList = Arrays.asList("1234", "1214", "1334");
    String mInput = "1334";
    Collections.sort(myList, new BringToFrontComparator<>(mInput));
    System.out.println(myList);
}

отпечатки

[1334, 1214, 1234]

Другие вопросы по теме