【问题标题】:Extract a list from list of lists [duplicate]从列表列表中提取列表[重复]
【发布时间】:2017-12-15 16:39:19
【问题描述】:

我在 java 中有一个列表。

static ArrayList<List> permutationS = new ArrayList<List>();

内部列表是整数的 ArrayList。

List<Integer> innerList = new ArrayList<Integer>();

现在我想选择一个innerList,如果它包含一个特定的整数。 我怎样才能做到这一点?

【问题讨论】:

  • 您希望每个列表都至少包含该整数的一个实例吗?
  • @k.krol.27 将只有一个包含特定整数的列表。下面是一个例子:[[0, 6, 13, 14], [1, 10, 11, 18], [2, 22, 4, 20], [3, -1, 21, 12], [5, 9, 17, 16], [7, 15, 19, 8]]

标签: java list arraylist


【解决方案1】:

也许有这样的结构?

for (List<Integer> lists : permutationS) {
    for(Integer integers : lists){
        //Your tests 
    }
}

【讨论】:

    【解决方案2】:

    这将允许您获取包含所需值的列表,如果没有任何内部列表包含它,它将返回一个新的空列表:

    int val = 10;
    List<Integer> innerList = permutationS.stream()    //iterate over inner lists
            .filter(list -> list.contains(val))        //keep one which contains the value
            .findAny()                                 //keep only one if exists
            .orElse(new ArrayList<>());                // if no-one return new List
    

    例子:

    permutationS.add(Arrays.asList(0, 6, 13, 14));
    permutationS.add(Arrays.asList(1, 10, 11, 18, 6, 78, 79, 9));
    permutationS.add(Arrays.asList(2, 22, 4, 20));
    
    List<Integer> innerList = permutationS.stream().filter(list -> list.contains(10))
                                                   .findAny().orElse(new ArrayList<>());
    innerList.size(); // = 8
    
    List<Integer> innerList2 = permutationS.stream().filter(list -> list.contains(34))
                                                    .findAny().orElse(new ArrayList<>());
    innnerList2.size(); // = 0
    

    【讨论】:

      【解决方案3】:

      一种解决方案是删除所有不包含特定整数(例如 10)的 List&lt;Integer&gt;s:

      permutationS.removeIf(list -> !list.contains(10));
      

      另一种解决方案是使用流和过滤来完成它:

      permutationS.stream()
                  .filter(list -> list.contains(10))
                  .collect(Collectors.toList());
      

      如果您只寻找一个List&lt;Integer&gt;,那么您可以使用以下内容:

      List<Integer> newList = permutationS.parallelStream()
                                          .filter(list -> list.contains(10))
                                          .findAny()
                                          .orElseGet(ArrayList::new);
      

      【讨论】:

      • parallelStream() 除了在更多内核可用时可以更快地执行之外没有其他优势。 parallelStream() 并不总能保证更快的结果。事实上,与顺序流相比,并行流的开销要高得多。只有在某些情况下您需要使用parallelStream()
      【解决方案4】:

      stream的解决方案:

      int x = 3; // the number to be looked
      
      List<Integer> selectedInnerList = permutationS.stream()
                                                    .filter(s -> s.contains(x))
                                                    .findFirst()
                                                    .get();
      

      注意findFirst()返回一个Optional对象,所以get()如果没有这个元素会抛出异常

      【讨论】:

      • 如果没有列表包含x,这将引发异常
      • @JacobG。编辑了我的答案以澄清这一点
      • @AlbertoTrindadeTavares 是从哪里来的?
      • @sheldoncooper s 是 lambda(匿名函数)的参数。我们不需要显式声明它
      【解决方案5】:

      这样做:

      List<List<Integer>> permutationS = new ArrayList<>();
      
      // list initialization here
      
      int i = 5; // the Integer you are searching for
      
      for(List<Integer> innerList : permutationS) {
         if(innerList.contains(i)) {
           // found, do something with innerList
         }
      }
      

      【讨论】:

        【解决方案6】:

        怎么样:

        public List getList(Object value) {
        
            for (List inner : Permutation_S) {
                if (inner.contains(value))
                    return inner;
            }
        }
        

        【讨论】:

          【解决方案7】:

          目前我不知道您使用的是哪个 Java 版本,我建议像这样循环遍历它

          List<List<Integer>> Permutation_S = new ArrayList<List<Integer>>(); 
          for(List<Integer> listInList: Permutation_S){
              for(Integer integerValue: listInList){
                  if(integerValue == 2 /*your desired value*/){
                      //DO SOMETHING
                  }
              }
          }
          

          当然,如果您使用的是 Java 8 或更高版本,您也可以使用流

          【讨论】:

          • permutationS 的类型是 List> 而不是 List>
          • so List> ?
          • (实际上更糟糕,因为它使用的是 rawtype 但它被认为与通配符类型相同) Type> 与 Type 因为一切都扩展了 Object,但没有提供 T,所以 T 是不可能的......在哪个 iirc 旁边,它的 E 而不是 T
          • 但他要的是整数
          猜你喜欢
          • 2021-10-10
          • 1970-01-01
          • 2021-10-22
          • 1970-01-01
          • 2013-09-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-07
          相关资源
          最近更新 更多