Добавьте список в соответствии с их размером на Java

#java #list #arraylist #append #java-stream

Вопрос:

Я пытаюсь добавить два списка в соответствии с их размером. Со списком большего размера спереди.

У меня мало таких списков.

List<Pair<Double, String>> masterList = new ArrayList<>();

и это рабочий Java — код, который я попробовал первым- с простым if else циклом:

        if (listOne.size() >= listTwo.size()){
           masterList.addAll(listOne);
           masterList.addAll(listTwo);
       } else {
           masterList.addAll(listTwo);
           masterList.addAll(listOne);
       }
       masterList.addAll(otherList); // and at the end all other list can be added without any condition
 

Я довольно новичок в Java, поэтому изучал ее и наткнулся на компараторы и Лямбду. Итак, я попытался использовать это для своего кода, что-то вроде этого:

 List<Pair<Double, String>> masterList = Stream.concat(listOne.stream(), listTwo.stream())
                .filter(Comparator.comparingInt(List::size))
                .collect(Collectors.toList())
 

Но я не в состоянии добиться должных результатов.
Может кто-нибудь указать на мою ошибку, я все еще пытаюсь учиться.

Комментарии:

1. Использование потоков здесь кажется совершенно ненужным, есть ли какая-либо причина, по которой вы должны это делать?

2. В основном это было с точки зрения обучения. Кроме того, с Stream помощью прецедента можно расширить число List

Ответ №1:

Цикл for очень хорош, Stream в этом нет необходимости, но, чтобы ответить на вопрос, вы можете

  • не используйте concat , так как он уже будет присоединяться к спискам, и вы потеряете концепцию другого списка
  • не используйте filter , а скорее sorted
  • затем flatMap перейти от Stream<List<Pair<>>> к Stream<Pair<>>
 List<Pair<Double, String>> masterList = Stream.of(listOne, listTwo)
        .sorted(Comparator.comparing(List::size, Comparator.reverseOrder()))
        .flatMap(List::stream)
        .collect(Collectors.toList());
masterList.addAll(otherList);
 

Комментарии:

1. @JoakimDanielson это только список, который ОП добавляет в конце

2. также как насчет того .sorted(Comparator.comparing(List::size, Comparator.reverseOrder())) , чтобы отсортировать их в обратном порядке, а затем выровнять — то же самое по-другому

3. @PiyushAggarwal не помнил эту конструкцию, хотя .sorted(Comparator.comparing(List::size).reversed()) и об ошибке non static method cannot be referenced , и я не хотел навязывать конкретный тип lmabda

Ответ №2:

Его можно использовать Stream.concat для объединения содержимого otherList и, таким образом, для избавления от masterList.addAll

Кроме того, есть пример использования Comparator.reversed() метода:

 List<Pair<Double, String>> masterList = Stream.concat(
        Stream.of(listOne, listTwo) // Stream<List<Pair>>
          .sorted(Comparator.<List>comparingInt(List::size).reversed())
          .flatMap(List::stream), // Stream<Pair>
        otherList.stream() // Stream<Pair>
    )
    .collect(Collectors.toList());
 

Однако тернарный оператор также должен хорошо работать, чтобы определить более длинный список для размещения в начале:

 List<Pair<Double, String>> masterList2 = Stream.concat(
        (listOne.size() >= listTwo.size() 
            ? Stream.of(listOne, listTwo) 
            : Stream.of(listTwo, listOne)
        ) 
        .flatMap(List::stream),
        otherList.stream()
    )
    .collect(Collectors.toList());