Сортировка списка по другому списку

233
25 сентября 2017, 01:41

Есть LinkedList<ClassXXX>, ClassXXX содержит множество полей, одно из которых Integer Id.

Есть ArrayList<Integer>, который содержит Id от ClassXXX.

Нужно отсортировать элементы LinkedList в той же самой последовательности, как они расположены в ArrayList. Если в ArrayList нет Id, которое есть в первом списке, то такие элементы располагаются в конце LinkedList. Также Id может быть во втором списке, но не быть в первом. Сортируется исключительно первый список LinkedList<ClassXXX>.

Подскажите, в какую сторону смотреть, чтобы это реализовать.

Answer 1

Можно завести HashMap<Integer, ClassXXX>, в которой ключами будут id, а значениями — экземпляры ClassXXX, с таким id. Далее, заводим новый LinkedList<ClassXXX>, проходимся по ArrayList<Integer> (список айдишек), получаем из HashMap экземпляр класса ClassXXX, с таким id и добавляем его в новый LinkedList<ClassXXX>.

Осталось добавить в конец нового LinkedList<ClassXXX> элементы, id которых не нашлись в ArrayList<Integer>. Можно сделать это так: при проходе по списку айдишек удалять из HashMap записи, а в конце добавить все значения из HashMap в конец нового LinkedList<ClassXXX>.

class Main {
    static class Item {
        int id;
        Item(int id) {
            this.id = id;
        }
    }
    public static void main(String[] args) {
        // пример входных данных
        ArrayList<Integer> ids = new ArrayList(Arrays.asList(4, 2, 1));
        LinkedList<Item> items = new LinkedList<>(Arrays.asList(
            new Item(1),
            new Item(2),
            new Item(3)
        ));
        // добавляем каждый item в Map
        HashMap<Integer, Item> idsToItems = new HashMap<>();
        for (Item item : items) {
            idsToItems.put(item.id, item);
        }
        LinkedList<Item> itemsSorted = new LinkedList<>();
        for (Integer id : ids) {
            if (idsToItems.containsKey(id)) {
                Item item = idsToItems.get(id);
                itemsSorted.add(item);
                idsToItems.remove(id);
            }
        }
        for (Item item : idsToItems.values()) {
            itemsSorted.add(item);
        }
        for (Item item : itemsSorted) {
            System.out.println(item.id);
        }
    }
}

Ideone

READ ALSO
Почему ArrayList.remove(i) в цикле ведёт к квадратичному времени выполнения?

Почему ArrayList.remove(i) в цикле ведёт к квадратичному времени выполнения?

На вопрос удаление каждого К-того элемента из arraylist по кругу был предложен ответ:

307
Почему пузьковая сортировка идет не до конца?

Почему пузьковая сортировка идет не до конца?

Есть массив из 4 элементовДелаю пузырькову сортировку но последний шаг он не делает

244
Как удалить одинаковые буквы из строки? - Java SE

Как удалить одинаковые буквы из строки? - Java SE

Возник вопрос: Как удалить одинаковые буквы из строки? Есть вот это:

382