Java(使用object' int int检查ArrayList)

时间:2014-06-26 02:05:08

标签: java arraylist

我必须创建一个包含对象的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());
}

5 个答案:

答案 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(对于HashSetLinkedHashSet),或实施Comparable或者Comparator(对于TreeSet)。