Использование Comparable с indexOf - PullRequest
2 голосов
/ 30 октября 2011

Я попробовал следующий простой тест.

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, но я не понимаю, почему первая строка не находит новуюс названием = "Кройдон".

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"));?

1 Ответ

9 голосов
/ 30 октября 2011

Переопределите equals вместо compareTo, если вы хотите выполнить операции поиска.

По умолчанию indexOf сравнивает с использованием операции равно, и в вашем случае равно не переопределено, что означает, что вы сравниваете по ссылкам.Когда вы создаете новый объект City с тем же именем, у вас есть еще одна ссылка на объект, поэтому равно return false.

PS Если вы используете объект, который описывает город, предпочтительное имя для класса City, а не Cities

...