Сортировать списокпо первому номеру в каждом подсписке - PullRequest
0 голосов
/ 23 октября 2018

Я столкнулся со следующей проблемой.У меня есть ArrayList (1) из ArrayLists (2).Что мне нужно сделать, так это отсортировать структуру так, чтобы первые элементы ArrayLists (2) располагались в порядке возрастания по убыванию ArrayList (1).Чтобы уточнить:

Ввод:

3, 8, 6
2, 14, 205, 44, 1
1, 3

Вывод:

1, 3
2, 14, 205, 44, 1
3, 8, 6

Посмотрите, как сортируются строки только по первому значению.

На данный момент способ определения массива arraylist для меня:

List<List<Integer>> graph = new ArrayList<List<Integer>>();
// and I add elements to it likewise
graph.get(currentIndex).add(new ArrayList<Integer>());

Причина, по которой я использую ArrayList, заключается в том, что я прочитал, что он более эффективен по памяти, чем LinkedList, и потому, что я строю список смежностисписки графа.В нем может меняться либо количество узлов, либо длина списка смежности на узел.Первый элемент строки - это start_node, следующий - его смежный.Не могли бы вы сказать мне, как я могу реализовать эту сортировку?

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

Итак, насколько я понимаю, вы хотите отсортировать список верхнего уровня по первому элементу каждого вложенного списка.Это правильно?Вот как я могу это сделать:

List<List<Integer>> graph = new ArrayList<List<Integer>>();
// add a bunch of things ...
// ...

// Now, to sort:
graph.sort((x,y) -> Integer.compare(x.get(0), y.get(0)));

Это использует Integer, чтобы получить Comparator, что и требуется sort() для сортировки по некоторым пользовательским критериям.В этом случае мы говорим ему отсортировать List из Lists graph, сравнивая два произвольных элемента в graph, получая их первые элементы и сравнивая их, как вы обычно сравниваете Integer s.

Обратите внимание, что это предполагает, что все элементы в graph имеют первый элемент.

0 голосов
/ 24 октября 2018

Итак, вот еще одно решение, которое я придумал.

Идея такова: использовать статический метод Collections sort () и передать его со ссылкой на список и новый объект Comparator с определеннымнами сравнить ().

Collections.sort(graph, new Comparator<List<Integer>>(){
@Override
public int compare(List<Integer> aList1, List<Integer> aList2) {
   return aList1.get(0).compareTo(aList2.get(0));
}
}));
0 голосов
/ 23 октября 2018

Чтобы сравнить 2 подсписка, вам нужно найти первую неравную пару и сравнить их значение (если оба начинаются как 32, вам нужно посмотреть следующее значение, чтобы увидеть)

List<List<Integer>> graph = new ArrayList<>();
graph.add(Arrays.asList(3, 8, 6));
graph.add(Arrays.asList(2, 14, 205, 44, 1));
graph.add(Arrays.asList(2, 14, 205, 44, 2));
graph.add(Arrays.asList(1, 3));
graph.add(Arrays.asList(1, 4));
graph.add(Arrays.asList(1, 4));
graph.add(Arrays.asList(1, 4, 5));

graph.sort((o1, o2) -> {
    int indice, cmp, min;
    for (indice = 0, min = Math.min(o1.size(), o2.size());
         indice < min; indice++) {
        if ((cmp = Integer.compare(o1.get(indice), o2.get(indice))) != 0) {
            return cmp;
        }
    }
    if (indice == o1.size()) return -1;
    if (indice == o2.size()) return 1;
    return 0;
});

System.out.println(graph);

[[1, 3], 
 [1, 4], 
 [1, 4], 
 [1, 4, 5], 
 [2, 14, 205, 44, 1], 
 [2, 14, 205, 44, 2], 
 [3, 8, 6]]

С другой стороны, используя Comparator интерфейс (я согласен, что это не очень хорошо), он сравнивает значение до одного из списка, если он пуст, тогда он будет сравнивать размер, если достигнет одного полностью

graph.sort((o1, o2) -> {
    Comparator<List<Integer>> cc = Comparator.comparingInt(l -> l.get(0));
    int indice, min;
    for (indice = 0, min = Math.min(o1.size(), o2.size()); indice < min; indice++) {
        final int i = indice;
        cc = cc.thenComparingInt(l -> l.get(i));
    }
    return cc.thenComparingInt(List::size).compare(o1, o2);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...