我必须创建一个包含对象的ArrayList
,该对象有一个int for year
让我们说1
而且我不知道同一年的另一个对象1。
如果一个对象的int = 1,我不希望在我的列表中有另一个带有int(1)的对象。 我想否认它。
我应该尝试使用相同的吗?
类似
@Override
public boolean equals(Object o){
Object object = (Object)o;
return this.getInt.equals(object.getInt());
}
答案 0 :(得分:3)
使用Set
...明确禁止重复,或检查列表是否包含插入元素。
@Override
public boolean add(T element) {
if(contains(element)) {
return false;
} else {
return super.add(element);
}
}
覆盖equals
不会让你走得太远,因为你要为List
本身覆盖它(即你要检查两个列表是否相等) )。
答案 1 :(得分:1)
也许您可以尝试使用链接的HashMap将“int”与对象链接起来。那可能是:
Map<Integer, Object> map = new HashMap<>();
map.put(object.getInt(), object);
...
//Each time you put a new object you could try this:
if(!map.contains(object.getInt()))
map.put(object.getInt, object);
//And you can retrieve your object by an int
int a = 1;
Object obj = map.get(1);
答案 2 :(得分:0)
在这种情况下,由于值的类型为int,因此可以使用相等的运算符。
public boolean equals(Object o){
Object object = (Object)o;
return (this.getInt()==object.getInt());
}
对于这种要求,ArrayList是不可取的。如其他答案中所述,尝试使用HashMap。
答案 3 :(得分:0)
是的,你可以。当你打电话
myArrayList.contains(myObejct);
ArrayList将调用myObejct的equals方法。因此,您可以判断对象是否已列在您的列表中。 而且我认为你可以稍微改变一下方法,
@Override
public boolean equals(Object o){
if (!(o instanceof YourClass))
return false;
YourClass object = (YourClass)o;
return this.getInt.equals(object.getInt());
}
因为如果你不这样做,方法&#34; getInt&#34;可能会导致MethodNotFound异常。
答案 4 :(得分:0)
嗯,这是解决问题的一种方法。
如果您更改equals
以投射到真实班级,您的Object object = (Object)o;
可能会有效。
但是,equals
应该处理o
不符合预期类型的情况。合同要求您返回false
而不是抛出ClassCastException
...
然后,您将使用list.contains(o)
来测试列表中是否存在具有相同int
值的对象。例如:
if (!list.contains(o)) {
list.add(o);
}
但是当你覆盖equals
时,最好还是覆盖hashcode
...以便你的类继续满足equals / hashcode不变量。 (如果忽略这一点,基于哈希的数据结构将会破坏您的课程。)
但是,这不能很好地扩展,因为contains
上的ArrayList
操作必须一次一个地测试列表中的每个元素。随着列表越来越长,contains
呼叫需要更长的时间......按比例增加;即O(N)
...使用Big O复杂符号。
因此,最好在Set
上使用ArrayList
某种实现方式。根据您选择的集合实施,您将获得O(1)
或O(logN)
的复杂性。但问题是你要必须来实施hashcode
(对于HashSet
或LinkedHashSet
),或实施Comparable
或者Comparator
(对于TreeSet
)。