【问题标题】:How to fix list.contains(object) not returning the good boolean variable如何修复 list.contains(object) 不返回好的布尔变量
【发布时间】:2019-08-28 20:19:35
【问题描述】:

我正在尝试使用一些随机生成的数组创建一个列表,该数组在一个范围内并具有固定大小。问题是,当我想查看一个数组是否已经在列表中时 (list.contains(array)) 它没有返回好的布尔变量。这就是这段代码的样子,我不知道问题出在哪里:

List<int[]> list = new ArrayList<int[]>();
int[] v = new int[n];
int n = 2, val_max = 3;

while (list.size() != max) {
  v = getRandomArray(n, 1, val_max);
  if (list.contains(v) == false)
    list.add(v);
}

我希望它的输出是{ {1, 2} {2, 1} {1, 3} {3, 1} {2, 3} {3, 2} },但输出不断变化......它总是将上述值中的一两个加倍,这让我认为问题必须来自 contains 函数。

【问题讨论】:

    标签: java list arraylist random contains


    【解决方案1】:

    List.contains 使用Object.equals 来检查是否相等,但数组使用引用相等,而不是内容相等。所以.contains 总是会返回 false。

    不幸的是,特别是对于数组,实际上只有两种选择:

    • 自己重写contains的逻辑,使用Arrays.equals
    • 将数组包装在您自己创建的新对象中,并适当地编写其相等方法。

    【讨论】:

    • for (int i = 0; i
    • 第三种选择:使用TreeSet 和一个显式比较器,该比较器按字典顺序比较int[]s。 (当然,这不会保留插入顺序)。
    • 还有一个选项:将每个数组包装在 IntBuffer 中。该类确实有一个基于数组元素值的equals 方法。
    猜你喜欢
    • 2018-09-21
    • 2020-08-06
    • 2010-11-30
    • 2019-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多