在java中如何做联合,相交,差异和反向数据

我想在Java中进行联合,相交,差异和反向操作。

首先,我有2个ArrayList<Integer>实例

 a = [0,2,4,5,6,8,10] b = [5,6,7,8,9,10] 

工会b应该返回c = [0,2,3,4,5,6,7,8,9,10]

相交b应该返回c = [5,8,10]

一个c = [0,2,3,4] b应该返回c = [0,2,3,4]

反向a = [10,8,6,5,4,2,0]

像这样的东西。

如何在Java中实现该方法?


更新 :我必须从这个模板开始:

 package IntSet; import java.util.ArrayList; import java.util.Collection; public class IntSet { private ArrayList<Integer> intset; public IntSet(){ intset = new ArrayList<Integer>(); } public void insert(int x){ intset.add(x); } public void remove(int x){ //implement here intset.indexOf(x); } public boolean member(int x){ //implement here return true; } public IntSet intersect(IntSet a){ //implement here return a; } public IntSet union(IntSet a){ //implement here return a; } public IntSet difference(IntSet a){ //implement here IntSet b = new IntSet(); return b; } 
 //Union List<Integer> c = new ArrayList<Integer>(a.size() + b.size()); addNoDups(c,a); addNoDups(c,b); private void addNoDups(List<Integer> toAddTo,List<Integer> iterateOver) { for(Integer num:iterateOver){ if(toAddTo.indexOf(num) == -1) { toAddTo.add(num); } } } //intersection List<Integer> c = new ArrayList<Integer> (a.size() > b.size() ?a.size():b.size()); c.addAll(a); c.retainAll(b); //difference ab List<Integer> c = new ArrayList<Integer> (a.size()); c.addAll(a); c.removeAll(b); 

首先,你描述的操作(reverse除外)是设置操作,而不是列表操作,所以使用HashSet或者(如果你需要sorting)TreeSet。

  Set<Integer> a = new TreeSet<Integer>(Arrays.asList(new Integer[]{0,2,4,5,6,8,10})); Set<Integer> b = new TreeSet<Integer>(Arrays.asList(new Integer[]{5,6,7,8,9,10})); //union Set<Integer> c = new TreeSet<Integer>(a); c.addAll(b); System.out.println(c); //intersection Set<Integer> d = new TreeSet<Integer>(a); d.retainAll(b); System.out.println(d); //difference Set<Integer> e = new TreeSet<Integer>(a); e.removeAll(b); System.out.println(e); //reverse List<Integer> list = new ArrayList<Integer>(a); java.util.Collections.reverse(list); System.out.println(list); 

如果你正在使用集合(你应该,除了相反的所有这些集合操作), 番石榴提供这些操作在它的Sets类。

 Set<Integer> union = Sets.union(set1, set2); Set<Integer> intersection = Sets.intersection(set1, set2); Set<Integer> difference = Sets.difference(set1, set2); 

所有这些返回不可修改的意见,由原始集支持。

请参阅番石榴解释 – > 集合实用程序 – > 设置

如果列表是你所拥有的,你可以通过使用所有标准集合中的拷贝构造函数将它们转换为Set:

 List<X> list = new ArrayList<>(); // fill up list here Set<X> set = new HashSet<>(list); 

许多答案告诉你使用库将为你做的工作。 虽然这是真实世界的正确解决scheme,但请记住,你正在做功课,你的老师可能希望你了解这些function是如何编写的,而不是如何find图书馆来为你工作。

也就是说,你已经看到了一个很好的开始。 让我们一步一步来解决这个问题。

首先,你知道Java文档的位置吗? http://download.oracle.com/javase/1.4.2/docs/api/这是至关重要的,因为这是你如何找出什么function做什么。; 这里是Java 1.4的链接。 我没有注意到你使用的是什么版本,但Java是向后兼容的,所以这应该是足够的。

在文档中,findArrayList条目。

现在我们已经有了API文档,我们需要分解您的问题。 你已经发布了代码,所以我会按function来解决它​​的function。

插入():你必须有一个有序的列表,或没有顺序无关紧要? 或者你保证价值会按顺序提供给你? 你有没有学过sortingalgorithm呢?

remove():这个函数不起作用。 看看ArrayList API,看看如何从列表中删除一个项目。 使用该方法。

member():你的成员方法不起作用。 您需要检查列表中的每个条目,并确定当前成员是否与函数参数匹配。 你了解了循环?

相交():好的,用英语告诉我交叉应该做什么。 如果可以帮助的话,不要用老师的描述 – 用你自己的话(注意别人,这是OP学习编程的练习,所以请不要为他回答)

差异():再次,用英语告诉我应该做什么。

反向():再次,给我英文说明这是应该做的。

一旦你有英文的描述,描述一个algorithm,可以做的工作。 不要用Java编写它。 用英文写一个algorithm,描述你如何用笔和纸手工完成工作。

在这一点上,尝试将algorithm转换为Java代码。

这段代码将使用apache commons CollectionUtils.union方法find两个集合的联合

 Collection<String> totalFriends = CollectionUtils.union(yourFriends, myFriends); 

我只是将它留在这里。 java-8streams有一个新的方法

 List<Integer> listA = Arrays.asList(0, 2, 4, 5, 6, 8, 10); List<Integer> listB = Arrays.asList(5, 6, 7, 8, 9, 10); List<Integer> intersection = listA.stream() .filter(listB::contains) .collect(Collectors.toList()); List<Integer> union = Stream.concat(listA.stream(), listB.stream()) .distinct().sorted() .collect(Collectors.toList()); List<Integer> aDiffB = listA.stream() .filter(i -> !listB.contains(i)) .collect(Collectors.toList()); System.out.println(intersection); // [5, 6, 8, 10] System.out.println(union); // [0, 2, 4, 5, 6, 7, 8, 9, 10] System.out.println(aDiffB); // [0, 2, 4]