Использование сопоставимого интерфейса при сравнении строк - PullRequest
2 голосов
/ 02 марта 2011

Я искал этот вопрос, но нашел только одну ветку, которая была немного запутанной, поэтому я собираюсь спросить здесь, что, я надеюсь, будет более ясным ответом.

У меня есть задание использовать интерфейс Comparable для сортировки объектов в массиве по имени клиента. До сих пор я делал это только с целыми числами, поэтому я не уверен, как сравнивать строки вместе. Как бы я пошел об этом? Вот где я до сих пор, предполагая, что я должен использовать a.name по сравнению с this.name:

public int comparedTo(Customer a)
{

}   //end comparedTo

Мне также нужно создать класс для реализации интерфейса Comparator для сортировки значений на основе покупок клиентов, и я думаю, что сделал это правильно, но я хотел бы убедиться, прежде чем я начну рвать на себе волосы, когда это неправильно. Вот что я сделал для этого:

class NameComparator implements Comparator{
public int compare(Object cust1, Object cust2){    

    String cust1Purch = ((Customer)cust1).purchase;        
    String cust2Purch = ((Customer)cust2).purchase;

    return cust1Purch.compareTo(cust2Purch);
}

Любая помощь очень ценится!

Ответы [ 5 ]

3 голосов
/ 02 марта 2011

Вот полный пример, который может вам помочь:

A CustomerComparator:

class CustomerComparator implements Comparator<Customer> {

    @Override
    public int compare(Customer c1, Customer c2) {
        return c1.name.compareTo(c2.name);   // or, simply c1.compareTo(c2);
    }
}

A Comparable Customer:

class Customer implements Comparable<Customer> {

    String name;

    public Customer(String name) {
        this.name = name;
    }

    @Override
    public int compareTo(Customer o) {
        return name.compareTo(o.name);
    }

    public String toString() {
        return name;
    }
}

Простой тестовый драйвер:

public class Test {
    public static void main(String[] args) {

        List<Customer> customers = Arrays.asList(new Customer("Bravo"),
                                                 new Customer("Charlie"),
                                                 new Customer("Delta"),
                                                 new Customer("Alpha"));
        Collections.sort(customers);

        // Or
        // Collections.sort(customers, new CustomerComparator());

        System.out.println(customers);

    }
}

( ideone.com demo )

3 голосов
/ 02 марта 2011

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

class NameComparator implements Comparator<Customer>{
public int compare(Customer cust1, Customer cust2){    

    String cust1Purch = cust1.purchase;        
    String cust2Purch = cust2.purchase;

    return cust1Purch.compareTo(cust2Purch);
}
0 голосов
/ 02 марта 2011

1) Я бы использовал обобщенные значения, чтобы определить ваш компаратор и избегать приведения дополнительного класса:

class NameComparator implements Comparator<Customer> {
    public int compare(Customer cust1, Customer cust2) {
      ...
    }
}

2) Строковый класс в Java уже реализует интерфейс Comparable (http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html).Так что, если вам нужно просто сравнить имя клиента или строку покупки, вы можете просто передать его в String, и это то, что вы уже делаете.

0 голосов
/ 02 марта 2011

Кажется, я правильно понял для интерфейса Comparable. Там нет ничего сложного.

Что касается Comparator, если вы не используете универсальные шаблоны, вам также необходимо проверить оба аргумента для одного и того же базового типа, по крайней мере, Comparable, поскольку вы используете этот интерфейс:

if (cust1 instanceof Comparable && cust2 instanceof Comparable) {
   Comparable c1 = (Comparable) cust1;
   Comparable c2 = (Comparable) cust2;
   return c1.compareTo(c2);
} else {
   return false;
}
0 голосов
/ 02 марта 2011

выглядит хорошо. Но вы можете использовать Generics:

class NameComparator implements Comparator<Customer> {
    public int compare(Customer cust1, Customer cust2) {..}
}
...