indexOf()将找不到自定义对象类型

时间:2014-07-25 14:14:28

标签: java arraylist indexof

以下代码没有给我正确答案。

class Point {

    int x; int y;
    public Point(int a,int b){
        this.x=a;this.y=b;
    }
}

class A{

    public static void main(String[] args){

        ArrayList<Point> p=new ArrayList<Point>();
        p.add(new Point(3,4));
        p.add(new Point(1,2));
        System.out.println(p.indexOf(1,2));

    }
}

这会给-1;

一般来说,如果给出了arraylist of point,我们怎样才能找到数组中特定点的索引?

4 个答案:

答案 0 :(得分:7)

indexOf需要对象作为输入。如果找不到要传入的对象,则返回-1。您需要将您要查找的arraylist中的位置作为输入传递给indexOf函数。在这种情况下,您还应该覆盖您的类的哈希码和等号。

在您的类Point中覆盖hashcode和equals。然后,一旦创建了此类Point的实例(使用new关键字)并将它们添加到arrayList,就可以使用任何Point对象作为indexOf调用的参数,对arrayList使用indexOf调用。

Class Point

public class Point {

        int x; 
        int y;

        public Point(int a, int b) {
        this.x=a;this.y=b;
        }

        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + x;
            result = prime * result + y;
            return result;
        }

        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Point other = (Point) obj;
            if (x != other.x)
                return false;
            if (y != other.y)
                return false;
            return true;
        }       
}

班级考试(你称之为“a”):

import java.util.ArrayList;

public class Test {

     public static void main(String[] args){

            ArrayList<Point> p=new ArrayList<Point>();

            Point p1 = new Point(3,4);
            Point p2 = new Point(1,2);

            p.add(new Point(3,4));
            p.add(new Point(1,2));

            System.out.println(p.indexOf(p1));
     }

}

答案 1 :(得分:3)

您需要创建一个传递给indexOf方法的点。

p.indexOf(new Point(1,2));

但这种变化本身仍然会返回-1。请参阅indexOf的api doc:

  

public int indexOf(Object o)

     

返回此列表中第一次出现的指定元素的索引,如果此列表不包含该元素,则返回-1。更正式地,返回最低索引i,使得(o == null?get(i)== null:o.equals(get(i))),如果没有这样的索引,则返回-1。

使用equals来决定是否找到了匹配项。你没有覆盖你的点类上的equals方法,所以它使用了比较引用的java.lang.Object中的默认实现,只有当两个引用指向同一个对象时才返回true 。

覆盖你的点类上的equals和hashcode,如:

@Override public boolean equals(Object other) {
    if (!(other instanceof point)) {
        return false;
    }
    point otherPoint = (point)other;
    return otherPoint.x == this.x && otherPoint.y == this.y;
}

@Override public int hashCode() {
    return x + y; // same values should hash to the same number
}

这样,可以通过值比较两个不同的类实例。

答案 2 :(得分:2)

ArrayList.indexOf()不接受两个整数作为参数。您必须输入一个对象,该对象应该是Point对象。

如果您仍想致电ArrayList.indexOf(int, int),则必须创建ArrayList的子类,并实施indexOf(int,int)

以下代码应该为您找到所需对象。首先,您需要覆盖 ObjectPoint类中的equals方法,以便比较两个点。

public class Point {
    private int x;
    private int y;

    @Override
    public boolean equals(Object anotherObject) {
        if (!(anotherObject instanceof Point)) {
            return false;
        }
        Point p = (Point) anotherObject;
        return (this.x == p.x && this.y == p.y);
    }
}

其次,您可以致电indexOf(Object)

ArrayList<Point> p = new ArrayList<Point>();
// Create the point to find in the list.
Point findMe = new Point(1,2);
// Search the array and save the found index.
int index = p.indexOf(findMe);

PS:您应该遵循Java命名约定;类必须以大写字母开头。

答案 3 :(得分:0)

  

我们怎样才能在数组中找到特定点的索引?

ArrayList<point> p=new ArrayList<point>();
point p1 = new point(3,4));
point p2 = new point(1,2));
p.add(p1);
p.add(p2);

System.out.println(p.indexOf(p1));

indexOf()的参数是一个对象。将它传递给你的一个点对象。