KaareZ
KaareZ

Reputation: 645

Java ArrayList indexOf returns -1

I have a strange problem with my code.

Heres the code I test the Chunk class with:

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

And here is the Chunk class' equals method:

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;
}

The 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;
    }

}

When I run it, it just returns -1. The test prints from the equals method doesn't print, which means that it's not even begin executed. Why is that?

Upvotes: 0

Views: 245

Answers (2)

Tagir Valeev
Tagir Valeev

Reputation: 100209

If you check the ArrayList.indexOf implementation, you will see that Vector3i.equals is called in your case. Actually it's even specified in JavaDoc for List:

More formally, returns the lowest index i such that (o==null ? get(i)==null : o.equals(get(i))), or -1 if there is no such index.

In general equals operation must be symmetric: a.equals(b) == b.equals(a). So you have to implement Vector3i.equals as well.

Please note also that your current equals implementation lacks other properties like reflexivity. Also consider implementing the hashCode when you implement an equals.

Upvotes: 5

Pavan Kumar K
Pavan Kumar K

Reputation: 1376

chunks.indexOf(new Vector3i(1, 1, 1)

calls equals() method on Vector3i class, howeve, not on Chunk class...

Upvotes: 0

Related Questions