我想在Java中进行联合,交叉,差异和反向操作.
首先,我有2个实例 ArrayList<Integer>
a = [0,2,4,5,6,8,10]
b = [5,6,7,8,9,10]
Run Code Online (Sandbox Code Playgroud)
工会乙应该回来 c = [0,2,3,4,5,6,7,8,9,10]
交叉b应该返回 c = [5,8,10]
应该返回一个defference 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;
}
Run Code Online (Sandbox Code Playgroud)
Lan*_*dei 75
首先,您描述的操作(反向除外)是设置操作,而不是列表操作,因此使用HashSet或(如果需要排序)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);
Run Code Online (Sandbox Code Playgroud)
小智 43
//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 a-b
List<Integer> c = new ArrayList<Integer> (a.size());
c.addAll(a);
c.removeAll(b);
Run Code Online (Sandbox Code Playgroud)
Sea*_*oyd 28
如果你正在使用集合(正如你应该的那样,除了反向之外的所有那些都是Set操作),Guava在它的Sets类中提供了这些操作.
Set<Integer> union = Sets.union(set1, set2);
Set<Integer> intersection = Sets.intersection(set1, set2);
Set<Integer> difference = Sets.difference(set1, set2);
Run Code Online (Sandbox Code Playgroud)
所有这些都返回不可修改的视图,由原始集支持.
如果列表是您拥有的,则可以使用所有标准集合中存在的复制构造函数将它们转换为Set:
List<X> list = new ArrayList<>();
// fill up list here
Set<X> set = new HashSet<>(list);
Run Code Online (Sandbox Code Playgroud)
许多答案告诉您使用可以为您完成工作的库.虽然这是现实世界的正确解决方案,但请记住,您正在做家庭作业,而您的老师可能希望您了解如何编写函数,而不仅仅是如何找到库来为您完成工作.
也就是说,你已经开始使用你所展示的代码了.让我们一步一步地解决问题.
首先,您知道Java文档的位置吗?http://download.oracle.com/javase/1.4.2/docs/api/这很关键,因为这是你如何找出哪些功能做什么的.这是Java 1.4的链接.我没注意到你正在使用什么版本,但Java是向后兼容的,所以这应该足够了.
在文档中,找到ArrayList条目.
现在我们已经获得了API文档,我们需要打破你的问题.你发布了代码,所以我将按功能解决它.
insert():你必须有一个有序列表,或者顺序无关紧要?或者您是否保证会按顺序提供给您的价值?你学习了排序算法了吗?
remove():此函数不起作用.看一下ArrayList API,看看如何从列表中删除一个项目.使用该方法.
member():您的成员方法不起作用.您需要检查列表的每个条目,并确定当前成员是否与函数参数匹配.你学习了循环吗?
intersect():好的,用英语告诉我应该做什么交叉.如果你可以帮助它,请不要使用教师的描述 - 使用你自己的话(注意别人,这是OP学习编程的练习,所以请不要为他回答)
差异():再次,用英语告诉我它应该做什么.
reverse():再次,给我这个应该做的英文描述.
一旦你有英文描述,描述一个可以完成工作的算法.不要用Java编写它.只需用英文写一个算法,用笔和纸描述你将如何完成工作.
此时,尝试将算法转换为Java代码.
| 归档时间: |
|
| 查看次数: |
86397 次 |
| 最近记录: |