2012-03-28 2 views
0

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

Мой SOLN: взять строки в списке, и сделать компаратор передать список, и объект этого компаратора реализован класс операции Коллекции сортировки

public class SortStringsReverse { 

    public static void main(String[] args) { 
     List l = new ArrayList(); 
     l.add("ABC"); 
     l.add("ZXY"); 

     StringComparator comparatorObj = new StringComparator(); 
     Collections.sort(l, comparatorObj); 
     for(Object s: l){ 
      System.out.println("values are " + (String)s); 
     } 
    } 
} 

class StringComparator implements Comparator{ 

    public int compare(Object arg0, Object arg1) { 
     return ((String)arg1).compareTo((String)arg0);//return ((String)arg0).compareTo((String)arg1); 
    } 

} 
+0

Что вы подразумеваете под «обратным хронологическим порядком»? Если у вас нет формата времени в строке, это трудно понять, как вы будете сравнивать. Вы имели в виду «обратный лексический порядок»? –

+1

Кроме того, что вы подразумеваете под «лучшим способом»? Самая эффективная производительность/память или проще всего кодировать? –

+0

Вы смешиваете java 1.4 с 1.5. Используйте 'List ', 'StringComparator реализует Comparator ', 'public int compare (String arg0, String arg1)'. Компилятор бросит за вас –

ответ

1

Поскольку вы указали, что вы хотите уникальных элементов в отсортировано способ, в Java лучшим инструментом для этого является TreeSet (хотя любая реализация SortedSet будет выполнена). Обычно класс TreeSet хранит элементы в порядке возрастания, но, к счастью, мы можем изменить это с помощью настраиваемого объекта Comparator в качестве аргумента.

Я предполагаю, что ваш вопрос, что вы хотите строки, отсортированные в обратном алфавитном порядке, так как хронологический порядок не имеет смысла здесь, но на самом деле вы можете реализовать свой собственный Comparator по мере необходимости. Теперь предоставленный вами Comparator будет сортировать строки в соответствии с исходным способом Java: строки, расположенные дальше в алфавите, будут сравниваться как ближайшие после строк «ближе» к началу алфавита (например, "bananas".compareTo("zebra") вернет положительный результат, "zebra".compareTo("bananas") - отрицательный . один Чтобы изменить алфавитный порядок, мы можем использовать эту двойственность и обратный порядок сравнения, сравнить второй аргумент против первого, как таковые:

class StringComparator implements Comparator<String>{ 

    public int compare(String arg0, String arg1) { 
     return arg1.compareTo(arg0); 
    } 

} 

Теперь передать объект этого класса в ваш TreeSet<String> объект, и вы должны быть установлены.

+0

спасибо за ответ и предположительно правильно (поскольку я использовал некоторые неправильные слова) .. код, который вы упомянули, тот же, что и мой (кроме generics и treeSet), обряд? –

+0

Код в основном тот же, но ваш вопрос не требует сложного решения. Вы должны использовать 'TreeSet', а не' List', потому что 'TreeSet' гарантирует две вещи: во-первых, все элементы в ней будут уникальными; во-вторых, все элементы будут отсортированы. Это намного лучший вариант, чем «Список», где ни одно из этих условий не гарантировано. Я использовал generics в моем примере 'Comparator', потому что он делает код более чистым, и он устраняет необходимость в кастинге. Другие вопросы? – fruchtose

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