从列表列表中提取列表[重复]

Posted

技术标签:

【中文标题】从列表列表中提取列表[重复]【英文标题】: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]] 【参考方案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 但他要的是整数

以上是关于从列表列表中提取列表[重复]的主要内容,如果未能解决你的问题,请参考以下文章

从列表中提取元素[重复]

从字典中提取第一个元素以构建列表[重复]

从字符串中提取数字到列表中[重复]

从列表中提取向量到数据框列[重复]

从文本文件中逐行提取数据并将其存储在python的列表中[重复]

如何从字典中获取列表[重复]