可疑调用ArrayList中的Collection.contains方法

时间:2015-10-13 23:04:23

标签: java arraylist contains

我收到警告,watchStore.contains(s)是对java.util.Collection#contains的可疑电话。我该如何解决?我想使用contains()来查找具有匹配序列号的特定对象。

public Watch findWatchBySerialNumber(long srch) {
    long s = srch;
    Watch watch = null;

    for(int i = 0; i < watchStore.size(); i++) {
        watch = watchStore.get(i);
            if(watchStore.contains(s)) {
                System.out.print("item found");
                return watch;
            }
    } 
    System.out.print("item not found");
    return null; // watch is not found.
}

3 个答案:

答案 0 :(得分:3)

假设Watch是班级,watchStoreList<Watch>,并且serialNo上存在Watch字段...

public Optional<Watch> findWatchBySerialNumber(long serial) {
    return watchStore.stream()
                     .filter(w -> w.getSerialNo() == serial)
                     .findFirst();
}

如果您不使用Java 8,代码就会关闭,但由于您有机会返回null,因此更加危险。如果您可以使用Guava的Optional,那么这就是更好的选择。

public Watch findWatchBySerialNumber(long serial) {
    for(Watch w : watchStore) {
        if(w.getSerialNo() == serial) {
            return w;
        }
     }
     return null;
}

由于您的列表不包含contains,因此Long无法正常工作,它包含Watch个。这也是编译器认为它可疑的原因; contains接受Object,但如果您要查找的内容与false的内容相同,则equals会返回render :text => '<script type="text/javascript">window.opener.location.reload(true);window.close();</script>' 你的清单。

您必须遍历整个集合才能在此场景中找到它,特别是因为您正在寻找这些对象上的特定属性,而不是特定的,易于提供的值。

答案 1 :(得分:-1)

  

请问我该如何解决这个问题。我想用contains()来查找   具有匹配序列号的特定对象。

在这种情况下,覆盖Watch的equals()以使用serialNumber字段进行比较。

然后添加接受serialNumber的构造函数。

public class Watch {
    private final long serialNumber;

    public Watch(long serialNumber) {
        this.serialNumber = serialNumber;
    }

    @Override
    public boolean equals(Object obj) {
        return obj == this ||
            (obj instanceof Watch && ((Watch)obj).serialNumber == serialNumber);
    }

    @Override
    public int hashCode() {
        return (int)serialNumber;
    }
}

if(watchStore.contains(s)){替换为if(watchStore.contains(watchToFind)){,其中Watch watchToFind = new Watch(s);

答案 2 :(得分:-2)

你可以使用org.apache.commons.lang.ArrayUtils包中的contains方法。

检查值是否在给定数组中。

如果传入空数组,则该方法返回false。

参数:     对数组进行数组搜索     valueToFind要查找的值 返回:     如果数组包含对象

,则为true

long [] imageHashes = {12l,13l,14l,15l};  System.out.println(ArrayUtils.contains(imageHashes,13l));