【问题标题】:Java ArrayList indexOf returns -1Java ArrayList indexOf 返回 -1
【发布时间】:2015-06-15 11:47:56
【问题描述】:

我的代码有一个奇怪的问题。

这是我用来测试 Chunk 类的代码:

List<Chunk> chunks = new ArrayList<Chunk>();
chunks.add(new Chunk(1,1,1));
System.out.println(chunks.indexOf(new Vector3i(1, 1, 1)));

这里是 Chunk 类的 equals 方法:

public boolean equals(Object object) {
    System.out.println("Test _1_");
    if (object != null && object instanceof Vector3i) {
        System.out.println("Test _2_");
        if((this.x == ((Vector3i) object).x)&&(this.y == ((Vector3i) object).y)&&(this.z == ((Vector3i) object).z)) {
            System.out.println("Test _3_");
            return true;
        }
    }
    System.out.println("Test _4_");

    return false;
}

Vector3i:

public class Vector3i {
    public int x;
    public int y;
    public int z;


    public Vector3i(int x, int y, int z) {
        this.x = x;
        this.y = y;
        this.z = z;
    }

}

当我运行它时,它只返回 -1。来自 equals 方法的测试打印不打印,这意味着它甚至没有开始执行。这是为什么呢?

【问题讨论】:

  • 这是对Object.equals() contract 的严重滥用。您的equals() 方法不是reflexivesymmetrictransitive。改用Map&lt;Vector3i,Chunk&gt; 将唯一块与给定向量值相关联。
  • 你有一个名为Chunk 的类,它有一个equals 方法来检查参数是否是其他类型?
  • @MadConan 因为chunk里面有很多数据,如果和新的比较的话会太重了。
  • @KaareZ 这就是地图的用途。

标签: java arraylist equals indexof


【解决方案1】:

如果您检查 ArrayList.indexOf 实现,您将看到在您的情况下调用了 Vector3i.equals。实际上,它甚至在 JavaDoc 中为 List 指定:

更正式地说,返回满足(o==null ? get(i)==null : o.equals(get(i)))-1 的最低索引i,如果没有这样的索引。

一般equals 操作必须是对称的:a.equals(b) == b.equals(a)。所以你也必须实现Vector3i.equals

还请注意,您当前的 equals 实现缺少其他属性,例如自反性。在实现equals 时,还要考虑实现hashCode

【讨论】:

  • 谢谢!这成功了。
  • 虽然这是 100% 正确的,但它也是一个糟糕的建议。首先,您刚刚违反了Object.hashCode() 合同,所以我期待“为什么我的HashMap.get() 返回null?”很快的问题。其次,它仍然不会使equals() 具有反身性。
  • @biziclop,好吧,当我说“实现等于”时,暗示实现hashCode 也是一个好主意。至于其他equals() 属性(自反性、传递性、一致性),在链接的JavaDoc 中写得很好。好吧,我会在答案中添加一个通知。
【解决方案2】:
chunks.indexOf(new Vector3i(1, 1, 1)

在 Vector3i 类上调用 equals() 方法,但是,不是在 Chunk 类上......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-26
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    • 2012-01-25
    相关资源
    最近更新 更多