当前位置: 首页 > 知识库问答 >
问题:

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

尉迟龙光
2023-03-14

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

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

一般来说,若给定了点的数组列表,我们如何在数组中找到特定点的索引

共有3个答案

尹善
2023-03-14

数组列表索引() 不接受两个整数作为参数。您必须输入一个对象,该对象应该是 Point 对象。

如果您仍然想调用ArrayList。indexOf(int,int),则必须创建ArrayList的子类,实现indexOf/(int,int)

下面的代码应该可以为您找到想要的对象。首先,您需要重写Point类中的Objectclass中的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命名约定;类必须以大写字母开头。

费锋
2023-03-14

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

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

但更改本身仍将返回-1。有关indexOf,请参阅api文档:

public int indexOf(对象o)

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

它使用equals来决定是否找到匹配项。您还没有覆盖point类上的equals方法,因此它使用java.lang.Object中的默认实现,它比较引用,并且仅当两个引用指向同一对象时才返回true。

覆盖point类上的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
}

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

商振
2023-03-14

indexOf需要将对象作为输入。如果它没有找到您要传入的对象,它将返回-1。您需要将其在数组列表中的位置作为输入传递给indexOf函数。在这种情况下,您还应该覆盖类的hashcode和equals。

在类中重写哈希代码 和 等于 点。然后,一旦创建了此类 Point 的实例(使用 new 关键字)并将它们添加到数组列表中,就可以使用数组列表上的 indexOf 调用,使用任何 Point 对象作为 indexOf 调用的参数

类点

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

}
 类似资料:
  • 问题内容: 我创建了一个整数列表,并试图返回特定值的索引。该数组是3,8,2,5,1,4,7,6并且我想返回indexOf(3),应该为0。 导入java.util。*后,我在Eclipse Java Scrapbook中尝试了以下操作: 我也尝试过: 两者都返回-1。为什么?如何使它按预期工作? 问题答案: 它不是为了使它起作用。

  • 嗨,我正在尝试学习hashcode()和equals()方法的目的。我尝试了以下程序。 输出: 我有两个疑问: 1) 我认为HashMap将包含一个条目,因为两个对象(ob1和ob2)的hascode是相同的。有人能解释为什么HashMap中有两个条目吗? 2)为什么返回false?

  • 问题内容: 我是否可以使用标准方法将自己的自定义对象添加到Map,然后将其正确编组到MapMessage中?当前,我收到无效对象类型消息。我注意到WebSphere有解决方案,但是我正在寻找不受特定AS约束的东西,如果没有这种方法,也许JBoss支持的东西会起作用。 如何在WebSphere中进行操作:http : //publib.boulder.ibm.com/infocenter/dmndh

  • 问题内容: 我是Java的初学者,正在尝试创建自定义类的数组。假设我有一个名为car的类,并且我想创建一组称为Garage的汽车。如何将每辆车添加到车库?这就是我得到的: 问题答案: 如果要使用数组,则必须保留一个包含车库中汽车数量的计数器。最好使用而不是数组:

  • 我是一个新的编码和上课目前,我不知道什么似乎是这里的问题,但我试图阅读和挑选特定的信息,从一个单独的文本文件。非常感谢任何帮助!

  • 问题内容: 我有一个新闻和一个消息。所述含有选择加入到阵列时teamObjects的的tableView。我想将此数组添加到其中,以便可以从其中包含需要teamObjects的url请求的访问它们。但是我不断得到: “试图为关键团队插入非财产列表对象(“”) 如果有比将其存储在更好的方法,我愿意接受其他建议 方法 我的对象 问题答案: 实际上,您将需要将自定义对象归档到其中,然后将其保存到用户默认