zak*_*zak 4 java collections arraylist set
我有一个包含重复ArrayList的List.
我正在寻找解决方案来删除它们.
这是一个例子:
listOne = [[1, 0], [0, 1], [3, 2], [2, 3]]
Run Code Online (Sandbox Code Playgroud)
该集包含重复的List.通常我想得到:
theListAfterTransformation = [[1, 0],[3, 2]]
Run Code Online (Sandbox Code Playgroud)
这是我的小例子,我试图使用Set但它不能很好地工作.
public class Example {
public static void main( String[] args ) {
ArrayList<ArrayList<Integer>> lists = new ArrayList<>();
ArrayList<Integer> list1 = new ArrayList<>(); list1.add(1); list1.add(0);
ArrayList<Integer> list2 = new ArrayList<>(); list2.add(0); list2.add(1);
ArrayList<Integer> list3 = new ArrayList<>(); list3.add(3); list3.add(2);
ArrayList<Integer> list4 = new ArrayList<>(); list4.add(2); list4.add(3);
lists.add(list1);lists.add(list2);lists.add(list3);lists.add(list4);
System.out.println(getUnduplicateList(lists));
}
public static ArrayList<ArrayList<Integer>> getUnduplicateList( ArrayList<ArrayList<Integer>> lists) {
Iterator iterator = lists.iterator();
Set<ArrayList<Integer>> set = new HashSet<>();
while (iterator.hasNext()){
ArrayList<Integer> list = (ArrayList<Integer>) iterator.next();
set.add(list);
}
return new ArrayList<>(set);
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,这是我项目中的一个小例子,在这个实现中使用一个改变很多东西的解决方案将非常困难.
因此,请考虑getUnduplicateList应保持相同的签名.好主意只是改变实施.
该程序打印与输入相同的列表.请问任何想法.
关于术语的几个注释 - Set是一种独特的数据结构List,前者是无序的,不允许重复,而后者是基本的线性集合,通常是有序的,并允许重复.您似乎可以互换使用这些术语,这可能是您遇到的问题的一部分:Set这可能是适当的数据结构.
也就是说,您的代码似乎依赖于ListAPI,因此我们可以遵循这一点.请注意,您通常应该使用interface(List)的代码,而不是特定的类(ArrayList).
另外,考虑使用Arrays.asList简写方法初始化列表(请注意,这将返回一个不可变列表).
最后,请注意HashSet通过检查两个对象是否相同来消除重复hashCode.包含相同元素的列表仍然不被视为相同的列表,除非元素以相同的顺序出现,并且通常不会被视为重复.但是,集合以这样的方式实现equals,hashCode即包含完全相同元素的两个集合被认为是相等的(顺序无关紧要).
使用原始起始集合,您可以将每个内部列表转换为集合.然后,消除外部集合中的重复项.最后,将内部集合转换回列表,以保持与其余代码的兼容性(如果需要).无论内部列表的大小如何,此方法都将起作用.
您可以使用a Stream和使用方法引用来模拟这些步骤以进行转换Set,如下所示.
import java.util.List;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.stream.Collectors;
public class Example {
public static void main( String[] args ) {
List<Integer> list1 = Arrays.asList(1, 0);
List<Integer> list2 = Arrays.asList(0, 1);
List<Integer> list3 = Arrays.asList(3, 2);
List<Integer> list4 = Arrays.asList(2, 3);
List<List<Integer>> lists = Arrays.asList(list1, list2, list3, list4);
System.out.println(getUnduplicateList(lists));
}
public static List<List<Integer>> getUnduplicateList(List<List<Integer>> lists) {
return lists
.stream()
.map(HashSet::new)
.distinct()
.map(ArrayList::new)
.collect(Collectors.toList());
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
85 次 |
| 最近记录: |