2013-11-29 4 views
0

Могу ли я использовать метод compareTo() со вторым аргументом для сортировки объектов по различным переменным или использовать какой-либо другой метод?Как отсортировать объекты по различным переменным?

Например:

public class Girl implements Comparable<Girl> { 

    private String fName; 
    private String lName; 
    private int hotness; 

    public Girl() {} // blah blah constructor 

    @Override 
    public int compareTo (Girl g, int order) { 
     if (order == 1) // then sort by first name 
     if (order == 2) // then sort by last name 
     if (order == 3) // then sort by hotness 
    } 
} 
+0

В этом случае лучше, если вы используете компаратор – Deepak

+1

Важный момент, чтобы помнить, что сравнение должно согласовать в обоих направлениях, так что вам придется использовать 'order' атрибут другого объекта тоже. – Bohemian

ответ

2

Нет, вы не можете. Вы обнаружите, что код не компилируется - в аннотации @Override говорится, что compareTo(Girl, int) должен быть объявлен в суперклассе или интерфейсе, но это не так! Comparable<Girl> определяет только compareTo(Girl).

Вместо этого вы должны использовать Comparator<Girl> для каждого заказа. Это класс, который предоставляет свой собственный compareTo, в котором принимают две девушки. Затем вы можете создавать разные компараторы и передавать соответствующую функцию, которая ему нужна. Другими словами, удалите поле order с Girl и вместо этого реализуйте различные порядки как разные экземпляры Comparator<Girl>.

Большинство классов и функций, которые принимают T extends Comparable<T> также есть версии, которые занимают Tи в Comparator<T>. Одним из примеров этого является Collections.sort. Другой - TreeSet, который может принимать компаратор во время строительства.

Если это кажется раздражающим или педантичным, подумайте о том, как вы будете использовать такую ​​функцию. Скажем, ваша функция занимает T extends Comparable<T>. Вы пытаетесь сравнить два из них, позвонив по номеру item1.compareTo(item2), в соответствии с этим интерфейсом Comparable. Если ваш код скомпилирован, этого метода не будет! Обратите внимание, что Java не имеет параметров по умолчанию, поэтому нет способа сказать «если они не пройдут в int order, предположим, что это 0.»

+0

+1 для использования пользовательского компаратора. – camickr

1

Вы не перекрывая метод compareTo, но перегружать его. И маркировка с @Override не позволит скомпилировать класс.

Используйте несколько классов Comparator для сравнения Girls на основе сценариев dirrent.

+1

+1 для переменной экземпляра, хотя вы должны показать ее как параметр при построении класса. – camickr

+0

-1 Это действительно очень опасная идея, и она нарушает договор «Сопоставимый». Что делать, если у вас есть одна девушка, созданная с помощью 'order = 1', а вторая -' order = 2'? В этом случае у вас может быть 'girl1.compareTo (girl2)> 0' _and_' girl2.compareTo (girl1)> 0'. Это означает, что в 'Girl' нет [полного упорядочения] (http://en.wikipedia.org/wiki/Total_ordering), который [' Comparable'] (http://docs.oracle.com/javase /7/docs/api/java/lang/Comparable.html). Много кода, скорее всего, сломается. – yshavit

+0

Я согласен с @yshavit. Я возвращаю свой верх (если бы мог). Я думал, что код создает пользовательский компаратор. Я не был в очках :) – camickr

0

Нет, то, что вы пытаетесь сделать, не будет работать, поскольку вы не переопределяете метод compareTo(). Альтернативным решением здесь может быть использование Collections.sort() для сортировки ваших коллекций с помощью пользовательского компаратора и использования переменной order (оно должно быть сделано final, чтобы иметь возможность использовать его в этом). Что-то вроде этого.

void inSomeMethod() { 
    final int order = 0; // has to be final 
    Collections.sort(new ArrayList<Girl>(), new Comparator<Girl>() { // for example 

     @Override 
     public int compare(Girl o1, Girl o2) { 
      if (order == 1) // then sort by first name 
      if (order == 2) // then sort by last name 
      if (order == 3) // then sort by hotness 
      return 0; 
     } 
    }); 
} 
Смежные вопросы