2012-02-16 4 views
3

Допустим, у меня есть класс альбома. Как я закодировать метод CompareTo так, что, когда я имею в ArrayList объекта альбома и я называюПереопределить compareTo и отсортировать по двум строкам

Collections.sort()

будет сортировать их в по названию следуют певицы в порядке возрастания.

Public class Album implements Comparable{ 

private String title; 
private String singer; 
private double price; 

..... 

public int compareTo(){ 

// How to 

} 

} 

ответ

3
public class Album implements Comparable<Album> { 
    ... 
    public int compareTo(Album other) { 
    int cmp = title.compareTo(other.title); 
    if (cmp == 0) { 
     cmp = singer.compareTo(other.singer); 
    } 
    return cmp; 
    } 
} 
5

Я хотел бы написать это как

public int compareTo(Album other) { 
    int primary = title.compareTo(other.title); 
    return primary != 0 ? primary 
         : singer.compareTo(other.singer); 
} 

Лично однако, я бы сказал, что это спорно или нет альбомов имеют «естественный порядок». Рассмотрим, например, если вы в будущем хотите сортировать альбомы по рейтингу или году.

Если на вашем месте я бы, вероятно, создать Comparator для этой цели:

class TitleSingerComparator implements Comparator<Album> { 
    public int compare(Album a, Album b) { 
     int primary = a.title.compareTo(b.title); 
     return primary != 0 ? primary 
          : a.singer.compareTo(b.singer); 
    } 
} 

и сортировать коллекцию, используя

Collections.sort(albums, new TitleSingerComparator()); 
+0

Ваш arguement кажется разумным. Однако ради этого вопроса ответ Луи - это то, что я ищу. Проголосуйте за вас! – root