2016-06-17 3 views
0

Я изучаю различия между компаратором и сопоставимым интерфейсом.Сопоставим: Сравните объект по различным параметрам с помощью compareTo

На других сайтах и ​​даже в stackoverflow упоминается, что мы использовали Comparator, когда нам нужно сортировать по различным полям.

Теперь я использую Сопоставимые как этот

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Iterator; 
import java.util.List; 

class HDTV implements Comparable<HDTV> { 
    private int size; 
    private String brand; 
    private int price; 

    public HDTV(int size, String brand, int price) { 
      this.size = size; 
      this.brand = brand; 
      this.price = price; 
    } 


    public int getPrice() { 
     return price; 
    } 

    public void setPrice(int price) { 
     this.price = price; 
    } 

    public int getSize() { 
     return size; 
    } 

    public void setSize(int size) { 
     this.size = size; 
    } 

    public String getBrand() { 
     return brand; 
    } 

    public void setBrand(String brand) { 
     this.brand = brand; 
    } 

    @Override 
    public int compareTo(HDTV tv) { 

     if (this.getSize() > tv.getSize()) 
      return 1; 
     else if (this.getSize() < tv.getSize()) 
      return -1; 
     else if (this.getPrice() > tv.getPrice()) 
      return 1; 
     else if (this.getPrice() < tv.getPrice()) 
      return -1; 
     else 
      return 0; 
    } 
} 

public class Test { 
    public static void main(String[] args) { 
     HDTV tv1 = new HDTV(60, "Samsung", 30000); 
     HDTV tv2 = new HDTV(60, "Sony", 20000); 
     HDTV tv3 = new HDTV(50, "LG", 20000); 
     List<HDTV> l = new ArrayList<>(); 
     l.add(tv1); 
     l.add(tv2); 
     l.add(tv3); 
     Collections.sort(l); 
     Iterator it = l.iterator(); 
     while (it.hasNext()) 
      System.out.println(((HDTV)it.next()).getBrand()); 
     if (tv1.compareTo(tv2) > 0) { 
      System.out.println(tv1.getBrand() + " is better."); 
     } else { 
      System.out.println(tv2.getBrand() + " is better."); 
     } 
    } 
} 

выше программа поможет нам сортировать по размеру, то по цене, означает, что мы можем отсортировать с помощью двух параметров по сравнимой также. (Как в моем понимании, которое является неправильно).

Да, может быть, этот код неправильный, но я не в состоянии понять это.

Я получаю ожидаемый заказ.

Пожалуйста, помогите мне уточнить мои сомнения.

+2

Вы написали _ «Я получаю ожидаемый заказ» _ - Если вы получаете ожидаемый заказ, то в чем проблема? –

+1

Странно иметь конструктор между геттерами и сеттерами. Обычно это ставится первым. – Andreas

+0

см. Первый пункт http://www.javatpoint.com/difference-between-comparable-and-comparator это неправильно? – sparsh610

ответ

1

Ссылку вы процитировали в комментарии говорится:

Сопоставимые обеспечивает единую последовательность сортировки. Другими слова, мы можем отсортировать коллекцию на основе одного элемента, такие как идентификатор или имя или цена и т.д.

против

Компаратора обеспечивает многократную последовательность сортировки. Другими словами, мы можем сортировать коллекцию на основе множества элементов, таких как идентификатор, имя и цена и т. Д.

Путаница здесь по фразе «множественная последовательность сортировки», а также тот факт, что описание неверен.

Что они хотят сказать, что если вы используете интерфейс Comparable, то объекты всегда будут сортироваться в соответствии с одной последовательностью, реализованной в методе compareTo(). Последовательность может быть такой сложной, какой вам нужно, на основе нескольких полей с объектом.

При использовании Comparator вы предоставляете последовательность сортировки динамически и можете реализовать множество различных объектов Comparator, которые сортируют коллекцию по-разному. Это то, что они подразумевают под «множественной сортировкой ssequence».

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

В вашем примере вы можете сделать Comparator, чтобы отсортировать по бренду, а затем отсортировать по цене по цене, затем размер.

Что касается этой веб-страницы, я бы нашел ее лучше. Лучшей ссылкой всегда является документация Oracle. Научитесь читать Javadoc, и вы всегда получите лучшую информацию. Иногда бывает трудно читать, но это стоит инвестиций.

+0

'ssequence' ->' sequence' ;-) --- Я бы не сказал «динамически». Он по-прежнему очень статичен при вызове 'sort()'. «Отдельно» может быть лучше? Если, конечно, вы не реализуете конфигурацию «Компаратор», но я не думаю, что это то, о чем вы говорили. – Andreas

0

Компаратор и сопоставимые служат двум различным целям .. оба используются для сортировки объектов так, как вы хотите. В приведенном выше случае вы можете сортировать только для конкретного случая, когда вы хотите сортировать телевизоры на основе размера и цены. В будущем, если вы хотите, чтобы он сортировался по цене ... тогда вам нужно изменить метод compareTo в приведенном выше подходе. Но вместо этого вы можете написать интерфейс Comparator, где вы можете отсортировать элементы tv без изменения класса с помощью Collections.sort(1,new PriceComparator()). Надеюсь, что это вопрос.

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