关于Java:从列表的集合中提取列表

Extract a list from list of lists

本问题已经有最佳答案,请猛点这里访问。

我有一个Java列表。

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

内部列表是整数的数组列表。

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

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


这样做:

1
2
3
4
5
6
7
8
9
10
11
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
   }
}

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

1
2
3
4
5
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

例子:

1
2
3
4
5
6
7
8
9
10
11
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


可能有这样的结构?

1
2
3
4
5
for (List<Integer> lists : permutationS) {
    for(Integer integers : lists){
        //Your tests
    }
}

一种解决方案是删除不包含特定整数(例如10)的所有List

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

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

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

如果你只想找一个单一的List,那么你可以使用以下方法:

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


怎么样:

1
2
3
4
5
6
7
public List getList(Object value) {

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

使用stream的解决方案:

1
2
3
4
5
6
int x = 3; // the number to be looked

List<Integer> selectedInnerList = permutationS.stream()
                                              .filter(s -> s.contains(x))
                                              .findFirst()
                                              .get();

注意,findFirst()返回一个可选对象,因此如果没有这样的元素,get()将抛出一个异常


至于我不知道您使用的Java版本,我建议循环使用它。

1
2
3
4
5
6
7
8
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或更高版本,则可以使用流。