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 |
一种解决方案是删除不包含特定整数(例如10)的所有
1 | permutationS.removeIf(list -> !list.contains(10)); |
另一种解决方案是使用流和过滤来完成它:
1 2 3 | permutationS.stream() .filter(list -> list.contains(10)) .collect(Collectors.toList()); |
如果你只想找一个单一的
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 |
使用
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(); |
注意,
至于我不知道您使用的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或更高版本,则可以使用流。