使用带有indexOf的Comparable

时间:2011-10-30 13:12:39

标签: java scjp

我尝试了以下简单测试。

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,那么它将从列表中返回第一次出现的null对象的索引。如果它不为null,它将返回传入的对象equals方法返回true的第一个匹配项的索引。

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

2 个答案:

答案 0 :(得分:9)

如果您想执行搜索操作,请重新定义equals而不是compareTo

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

P.S。如果您正在使用描述城市的对象,则为城市而非城市的优选名称

答案 1 :(得分: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
}