我设计了使用 ArrayList 的新 IntSet 类。首先,我通过 ArrayList 扩展 Intset 并开始实现方法。我在 union() 方法中遇到了一些问题。这是我的代码...
public class IntSet extends ArrayList<Integer>{
private static final long serialVersionUID = 1L;
private ArrayList<Integer> intset;
public IntSet(){
this.intset = new ArrayList<Integer>();
}
public IntSet(ArrayList<Integer> intset){
this.intset = intset;
}
public void insert(int x){
this.intset.add(x);
}
@Override
public Integer remove(int x){
int index = intset.indexOf(x);
this.intset.remove(index);
return 1;
}
@Override
public int size(){
return this.intset.size();
}
@Override
public Integer get(int index){
return this.intset.get(index);
}
public boolean member(int x){
if(intset.indexOf(x)==-1) return false;
else return true;
}
public IntSet union(IntSet a){
IntSet intersectSet = new IntSet();
intersectSet.insert(0);
intersectSet.insert(1);
System.out.println(intersectSet.size());
System.out.println(intersectSet.contains(1));
for(int i=0; i<a.size(); i++){
}
return intersectSet;
}
public String toString(){
if(intset.size()==0) return "[]";
String s = "[" + intset.get(0).toString();
for(int i=1; i<intset.size(); i++){
s += "," + intset.get(i).toString();
}
return s += "]";
}
}
在方法中
union(IntSet a);
我构建了新的 Intset 对象,然后将 2 个值 (0, 1) 添加到 intersectSet 变量中。
intersectSet.insert(0);
intersectSet.insert(1);
然后我打印 intersectSet 的大小,它告诉我 2 是正确的!
但是当我需要检查 intersectSet 中是否有 1 时?它显示我是错误的。
System.out.println(intersectSet.contains(1));
事实上,它应该告诉我是真的,因为在 intersectSet 中有整数 1。
我的代码有什么问题吗?我应该为 IntSet 类扩展 ArrayList 吗?
最佳答案
关于类设计的一些建议:
- 不要让你的类扩展 ArrayList。 “集合”真的不应该扩展列表。但是,您可能应该实现 Set。这将有额外的好处,编译器会告诉您需要为集合实现哪些方法......
- 为了获得最快的性能(但工作更多!),您可能希望使用内部数组而不是 ArrayList。
- 考虑使结构不可变,使用返回新副本而不是就地改变集合的函数。根据您的使用情况,这可能是更好的解决方案,尤其是当您主要处理小型、不变的集合时。
- 同样,根据您的使用情况,您可能希望覆盖 hashCode 和 equals 以实现基于值的相等性
- 当您使用 ArrayList 构造 Intset 时,理想情况下您应该防御性地复制(克隆)ArrayList。如果有人改变原始 ArrayList,您不希望您设置更改。
关于java - 我的 Intset 类有什么问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3594294/