2015-03-27 2 views
-3

Мне нужно написать метод под названием search, который принимает массив объектов в порядке возрастания свойства (в моем случае Value) и одного объекта. Использует compareTo, который я создал, чтобы ответить, если данный объект найден в массиве.Сортировка массива объектов сложна

Мне тяжело думать о том, как это сделать.

Я знаю, Theres метод в java.util.Arrays; где-то, конечно, я попытался Arrays.sort(_traesure);, но это приведет к ошибке: Treasure cannot be cast to java.lang.Comparable я себе представить, потому что он не знает, что его сортировки по.

Мне нужно передать массив объектов в порядке возрастания их значения.

Ive видел много сообщений о компараторе, но я не уверен, что они/делают?

Может ли кто-нибудь указать мне в правильном направлении.

+1

только для уточнения: вы хотите отсортировать массив первым и выполнить поиск в массиве, чтобы узнать, находится ли этот объект в этом массиве ??? –

+0

Читайте это: http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html –

+0

попробуйте эту ссылку, возможно, это поможет http://stackoverflow.com/questions/18895915/ how-to-sort-a-array-of-objects-in-java – Iftikhar

ответ

1

A Сопоставимый в Java интерфейс, который сообщает Java, «это имеет функцию compareTo». По вашему контексту, похоже, что у вас есть что-то вроде public class Treasure, которое вы хотите отсортировать. Вам нужно будет изменить это на public class Treasure implements Comparable<Treasure> - см. the Comparable docs для более подробной информации.

Для реализации этого потребуется создать функцию compareTo(Treasure other), которая позволит Arrays знать, как сортировать объекты Treasure.

Пример кода:

public class Treasure implements Comparable<Treasure> { 
    private int value; 
    public Treasure(int value) { this.value = value; } 

    public int compareTo(Treasure other) { return Integer.compare(value, other.value); } 

Создание Компаратор - как в ответ @kha «s - необходим, если вы хотите использовать Коллекции функции, требующие сравнения значений. Внедрение Comparable - как и выше - дает вашему классу публичный компаратор везде, где он есть, что может быть, возможно, более полезным в определенных ситуациях. В вашем случае вы можете пойти в любом случае и быть счастливым.

0

Из Javadoc метода

public static void sort(Object[] a) 

-.

«сортирует заданный массив объектов в порядке возрастания, в соответствии с естественным порядком ее элементов Все элементы в массиве должны реализовать интерфейс Comparable. Кроме того, все элементы в массиве должны быть взаимно сопоставимыми (то есть e1.compareTo (e2) не должен генерировать исключение ClassCastException для любых элементов e1 и e2 в массиве). "

Вы можете прочитать об этом здесь -> http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#sort(java.lang.Object[])

Как я уже говорил в моих комментариях, это выглядит как массив вы передаете в ваш метод содержит элементы, которые не имеют естественный порядок, т.е. не реализуйте интерфейс Comparable.

Ниже приведен пример декларации метода.

public <K extends Comparable<? super K>> boolean search(K[] values, K key){ 
} 

Лично я считаю, что поиск не является хорошим методом. Я думаю, что «нашел» было бы лучше.

Тем не менее, вы можете прочитать о Сопоставимом интерфейсе здесь -> http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html

Использования дженерик будут обеспечивать, что массив вы передаете метод содержит элементы, которые имеют естественный общий порядок, то есть они реализуют интерфейс Comparable.

Обратите также внимание на то, что javadoc интерфейса Comparable говорит следующее.

«Настоятельно рекомендуется (хотя и не обязательно), чтобы естественные порядки были согласованы с равными. Это связано с тем, что отсортированные наборы (и отсортированные карты) без явных компараторов ведут себя« странно », когда они используются с элементами (или ключами) чье естественное упорядочение несовместимо с равными. В частности, такой сортированный набор (или отсортированная карта) нарушает общий контракт для множества (или отображения), который определяется в терминах метода равных ».

И, следовательно, вы также можете прочитать о методах equals и hashCode. Ниже приводится ссылка javadoc метода equals. http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals(java.lang.Object)

Смежные вопросы