4

我对contains()返回 false 的方法有疑问,即使ArrayList包含给定的Object. 我的代码如下:

String [] transaction = dbConnection.getPendingTransaction(username);
if (!onlineConnection.getSentTransactionRequests().contains(transaction)) {
    onlineConnection.getSentTransactionRequests().add(transaction);

    String packet = "RTR" + "_" + transaction[0] + "_" + transaction[2] + 
                        "_" + transaction[3] + "_" + transaction[4];
    onlineConnection.send(packet);
}

Thread.sleep()在迭代之间进行了尝试,所以ArrayList没有成功加载。

4

6 回答 6

8

hashCode()equals()of 数组在谈到这个时有点坏了(这是一个很长的不同讨论为什么)。

一种可能的解决方法是使用ArrayList<ArrayList<String>>而不是ArrayList<String[]>equals()方法ArrayList将如您所愿。

例如:

    ArrayList<String> l1 = new ArrayList<>();
    ArrayList<String> l2 = new ArrayList<>();
    l1.add("asdf");
    l2.add("asdf");
    ArrayList<ArrayList<String>> coll = new ArrayList<>();
    coll.add(l1);
    System.out.println(coll.contains(l2));

true正如预期的那样,将产生

于 2012-11-13T12:46:06.237 回答
1

查看 getPendingTransaction 和 getSentTransactionRequests 是否应该返回相同的数组而不是创建新的数组。其次,尝试调试并查找数组对象 ID。如果这不一样,但应该是(并且包含相同的元素),请尝试解决此问题(例如创建比较器或列表或类似的东西)。

于 2012-11-13T12:43:26.790 回答
1

问题是equals对于数组被定义为引用相等。换句话说,包含相同元素的两个不同数组不相等……根据equals方法。

如果您希望equals“事务”对象基于字符串的相等性,则需要创建一个自定义类来保存String[],并覆盖equals方法和hashcode方法。


顺便说一句,数组equals(Object)方法不是“有点破”。定义的语义equals只是反映了任何数组对象本质上是可变的事实。

于 2012-11-13T12:53:35.927 回答
0

这是因为String [] transaction是对象。当您调用containslist 时,使用方法将新对象与其他对象进行比较equals。想象它喜欢做

new Object().equals(new Object())
于 2012-11-13T12:39:45.067 回答
0

如果你必须使用List<String[]>,可能是你运气不好,equals()或者hashCode()看起来......

也许你最好创建方法来比较你的对象

就像是

public static boolean stringArrayListEquals(List<String[]> list, List<String[]> list2) {
    if (list.size() != list2.size()) return false;
    for (int i = 0; i < list.size(); ++i){
        if (!Arrays.equals(list.get(i), list2.get(i)) return false;
    }
    return true;
}

要测试contains(),您需要另一个循环...

尽管您应该认真使用List<List<String>>

于 2012-11-13T13:03:26.650 回答
0

我遇到过类似的问题。我刚刚写了下面的代码片段:

assertContains(list, toLookFor);  // To call the below private method  

private void assertContains(ArrayList<String> list, String toLookFor) {
        String arrayListToString = rulesList.toString();
        
         if (arrayListToString.contains(toLookFor))
                System.out.println("The list contains "+ toLookFor);
            else
                System.out.println("The list does not contains "+ toLookFor);
        
    }
于 2021-04-19T11:05:49.813 回答