以下代码没有给我正确答案。
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,我们怎样才能找到数组中特定点的索引?
答案 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)
。
以下代码应该为您找到所需对象。首先,您需要覆盖 Object
类Point
类中的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()
的参数是一个对象。将它传递给你的一个点对象。