2013-05-03 3 views
2

У меня есть ArrayList следующимСортировка текста с некоторыми правилами

100 AAA 500-1 Lorem Ipsum 
100 BBB 500-2 Lorem Ipsum 
101 AAA 500-1 Lorem Ipsum 
101 AAA 500-2 Lorem Ipsum 
100 BBB 500-3 Lorem Ipsum 

Я хочу, чтобы быть отсортирован в

101 AAA 500-1 Lorem Ipsum 
101 AAA 500-2 Lorem Ipsum 
100 AAA 500-1 Lorem Ipsum 
100 BBB 500-2 Lorem Ipsum 
100 BBB 500-3 Lorem Ipsum 

Во-первых, по убыванию по номеру (101, 100).

Во-вторых, восходящий по трехбуквенному слову (AAA, BBB).

В-третьих, в порядке возрастания третьей колонке (500-1, 500-2, 500-3)

я могу разделить каждый элемент пространством и получить отдельные слова и сортировки. Но может ли кто-нибудь помочь мне любым другим способом или известным алгоритмом? Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

Заранее спасибо.

+0

Я не разработчик Java, но должен быть какой-то «своего рода» функциональность в вашем объекте, который вы, вероятно, может переопределить сортировку по нескольким условиям ... –

+0

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

+2

Вы можете создать Объект для каждой строки и сделать его реализацией 'Comparable' и определить сортировку в методе' compareTo' (или использовать «Компаратор», как предлагает Dworza) –

ответ

7

Создание Comparator решит вашу проблему. Вы должны осуществить что-то вроде этого:

public class MyComparator implements Comparator<MyObject> {  
    public int compare(MyObject o1, MyObject o2) { 
    if (o1 == null || o2 == null) { 
     throw new NullPointerException(); 
    }  
    if (o1.getValue1() != o2.getValue1()) { 
     return Integer.compare(o1.getValue1(), o2.getValue1()); 
    }  
    return Integer.compare(o1.getValue2(), o2.getValue2()); 
    } 
} 

Конечно, есть и другие способы решения этой проблемы, например, вы можете реализовать свой собственный алгоритм сортировки. Однако, я считаю, что использование Comparator является правильным "java-way" для его решения.

+0

Это, безусловно, самый лучший способ сделать это. – durron597

+0

@Dworza Большое спасибо. Я попробую сейчас. – Mahesh

+0

Np..не не стесняйтесь спрашивать больше, если есть что-то неясное. О, и не забудьте также проверить мой пост как ответ, если он вам поможет :) – Dworza

0

Для этого вам необходимо реализовать Comparator и передать его методу sort() контейнера.

+0

благодарит! – Szocske

2

Предполагаю, что у вас есть Collection из String.

Я использую компаратор для его решения.

List<String> myCollection = new ArrayList<String>(); 

    Collections.sort(myCollection, new Comparator<String>() { 
     @Override 
     public int compare(String o1, String o2) { 
      // splitting it with space character 
      String[] split1 = o1.split(" "); 
      String[] split2 = o2.split(" "); 

      int i1 = Integer.parseInt(split1[0]); 
      int i2 = Integer.parseInt(split2[0]); 

      int diff = (i2 - i1); 

      if(diff != 0){ // if two integer are equal 
       return diff; 
      }else{ 
       return split2[1].compareTo(split1[1]); 
      } 
     } 
    }); 
Смежные вопросы