【问题标题】:find the list with the minimum size over a list of list在列表列表中找到具有最小大小的列表
【发布时间】:2018-11-20 16:57:49
【问题描述】:

我有一个列表列表,我想使用 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() 的签名。谁能给我一个提示?

【问题讨论】:

  • 简单的if-else有什么问题?
  • @NicholasK 我用不同大小的参数多次调用 getTheMinList,我写的只是一个小例子。

标签: java java-stream


【解决方案1】:

只是另一个想法......

正如@NullPointer 建议的那样,我会让该方法采用List&lt;List&lt;Integer&gt;&gt; 而不是可变参数。

鉴于此更改,您只需执行以下操作:

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

简短、简单且易读对吧?

请注意,上述内容将在集合为空时抛出NoSuchElementException,这也可能是您想要的预期行为,但以防万一这不是您可能想要在调用之前检查是否为空的预期行为min 或使用@NullPointer 建议的流方法,如果 Stream#min 返回空 Optional,则使用 Optional API 返回替代值。

【讨论】:

  • 谢谢你,我会检查我的代码。一般情况下,每个列表在通话前都不应该为空。
  • 当你使用可变参数时,你仍然可以像return Collections.min(Arrays.asList(lists), Comparator.comparingInt(List::size)); 这样简单地使用这个解决方案,它使用Arrays.asList,它在数组周围创建了一个轻量级包装器,允许将整个 Collection API 应用到一个现有的数组…
【解决方案2】:

你可以用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());

【讨论】:

  • 另一个建议:试试programming to an interface
  • 谢谢,我使用 var arg 因为我多次使用不同大小的参数调用 getTheMinList。
  • @zakzak List&lt;List&lt;Integer&gt;&gt; 也可以接受不同大小的外部 List 作为参数,如果你注意到的话。这意味着您也可以将其称为getTheMinList(List.of(List.of(0, 2, 3), List.of(0, 2, 3, 4)))getTheMinList(List.of(List.of(0, 2, 3), List.of(0, 2, 3, 4), List.of(1,2,3)))
  • 是的,但我每次都应该发送一个列表作为参数,在我的程序中我发送许多列表作为参数,比如 getTheMinList(l1,l2) ,getTheMinList(l1,l2,l3) 等等开...而且我只使用 java 8。
  • @zakzak min 的返回类型是 Optional&lt;T&gt;,您可以检查 Optional.empty 或使用 Optional.orElse API 回退到默认值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-21
  • 1970-01-01
  • 2016-09-04
  • 2011-04-27
  • 2020-01-29
  • 1970-01-01
  • 2019-11-10
相关资源
最近更新 更多