3

我尝试了以下简单的测试。

class ZiggyTest{
    public static void main(String[] args){

        List<Cities> cities3 = new ArrayList<Cities>();
        Cities city = new Cities("London");

        cities3.add(new Cities("Manchester"));
        cities3.add(new Cities("Glasgow"));
        cities3.add(new Cities("Leeds"));
        cities3.add(city);
        cities3.add(new Cities("Leicester"));
        cities3.add(new Cities("Croydon"));
        cities3.add(new Cities("Watford"));

        System.out.println("IndexOf(new Croydon) " 
                       + cities3.indexOf(new Cities("Croydon")));
        System.out.println("IndexOf(city) " 
                       + cities3.indexOf(city));
    }   
}

class Cities implements Comparable<Cities>{
    String title;

    Cities(String aTitle){
        this.title = aTitle;
    }

    public String getTitle(){
        return title;
    }

    public String toString(){
        return "Title : " + title;
    }

    public int compareTo(Cities c){
        return title.compareTo(c.getTitle());
    }
}

上述测试的输出是

IndexOf(new Croydon) -1
IndexOf(city) 3

我理解为什么第二行生成 3,但我不明白为什么第一行没有找到 title="Croydon" 的新行。

API 将该indexOf方法描述为

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

我认为 API 是说如果对象为空,那么它将返回列表中空对象第一次出现的索引。如果它不为 null,它将返回传入对象 equals 方法返回 true 的第一次出现的索引。

创建的对象不cities3.indexOf(new Cities("Croydon")应该等于之前添加的对象cities3.add(new Cities("Croydon"));吗?

4

2 回答 2

10

如果要执行搜索操作equals,请重新定义。compareTo

默认情况下 indexOf 使用 equals 操作进行比较,并且在您的情况下 equals 未重新定义,这意味着您可以通过引用进行比较。当您创建具有相同名称的新 City 对象时,您有另一个对对象的引用,因此 equals 返回 false。

PS 如果您使用的是描述城市的对象,请选择 City 而不是 Cities 类的名称

于 2011-10-30T13:17:10.413 回答
0

在 Swift 5.3 中,如果你的对象继承自 NSObject,你需要这样做:

方法名称是“isEqual”

public override func isEqual(_ object: Any?) -> Bool {
    if let myObj = object as? MyObj {
        return myObj.someProperty == self.someProperty
    }
    return false
}
于 2021-03-06T23:38:45.667 回答