найти список с минимальным размером над списком списка - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть список списка, и я хочу вернуть список с минимальным размером, используя java Stream.

Вот что я попробовал:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class Example {
   public static void main( String[] args )  {
         ArrayList<Integer> list1 = new ArrayList<>();
         list1.add(0);list1.add(2);list1.add(3);

         ArrayList<Integer> list2 = new ArrayList<>();
         list2.add(0);list2.add(2);list2.add(3);list2.add(4);

         System.out.println( getTheMinList(list1,list2).size());    
   }

   public static ArrayList<Integer> getTheMinList(ArrayList<Integer>... lists) {
         return Arrays.stream(lists)
                      .map(list->list.size())
                      /*here i stoped*/
                ;
   }
}

Программа должна напечатать 3 потому что первый список имеет минимальный размер.

Обратите внимание, что я не могу изменить подпись getTheMinList () .Может ли кто-нибудь дать мне подсказку?

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Просто еще одна идея ...

, как предложил @NullPointer, я бы заставил метод принимать List<List<Integer>> вместо varargs.

Учитывая это изменение, вы можете просто сделать:

Collections.min(lists, Comparator.comparingInt(List::size)); 

Коротко, просто и читабельно, верно?

Обратите внимание, что вышеприведенное будет выбрасывать NoSuchElementException после того, как коллекция пуста, что может также соответствовать ожидаемому поведению, которое вы хотите, но на случай, если это не то предназначение, которое вы можете проверить на пустоту до того, каквызов min или использование потокового подхода, предложенного @NullPointer, который использует Optional API для возврата альтернативного значения, если Stream # min возвращает пустой Optional.

0 голосов
/ 20 ноября 2018

Вы можете использовать Stream.min, сравнивая List.size:

public static List<Integer> getTheMinList(List<Integer>... lists){
    return Arrays.stream(lists)
            .min(Comparator.comparingInt(List::size))
            .orElse(new ArrayList<>());
}

или, возможно, лучше, если бы вы могли избавиться от var-args и непроверенного назначения

private static List<Integer> getTheMinList(List<List<Integer>> lists){
    return lists.stream()
            .min(Comparator.comparingInt(List::size))
            .orElse(new ArrayList<>());
}
// invoked as
System.out.println(getTheMinList(List.of(list1, list2)).size());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...