2016-02-12 3 views
0

Я новичок в написании вопросов здесь, хотя я использовал этот сайт уже некоторое время.Сортировка ArrayList строки [] с использованием нескольких индексов

Я хочу сортировать ArrayList в лексикальном порядке (= естественный порядок ?!) в зависимости от первых двух индексов массива. В настоящее время я использовал код ниже:

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Collections; 
import java.util.Comparator; 

public class SortArrayList { 

    public static void main(String[] args) { 

     ArrayList<String[]> workingSet = new ArrayList<>(); 
     workingSet.add(new String[]{"MiningCorp", "2265 Betacity"}); 
     workingSet.add(new String[]{"MiningCorp", "6454 Iotacity"}); 
     workingSet.add(new String[]{"Arbiter", "3812 Gammacity"}); 
     workingSet.add(new String[]{"MiningCorp", "1234 Thetacity"}); 
     workingSet.add(new String[]{"Arbiter", "1812 Deltacity"}); 

     Comparator<String[]> staComp = new Comparator<String[]>() { 

      @Override 
      public int compare(String[] first, String[] second) { 
       String composite1 = first[0] + " " + first[1]; 
       String composite2 = second[0] + " " + second[1]; 
       return composite1.compareTo(composite2); 
      } 
     }; 

     Collections.sort(workingSet, staComp); 
     for(String[] arr : workingSet){ 
      System.out.println(Arrays.toString(arr)); 
     } 


    } 

} 

Это должно обеспечить следующий вывод:

[Arbiter, 1812 Deltacity] 
[Arbiter, 3812 Gammacity] 
[MiningCorp, 1234 Thetacity] 
[MiningCorp, 2265 Betacity] 
[MiningCorp, 6454 Iotacity] 

Это именно то, что я хотел. Есть ли более элегантный способ с использованием заранее подготовленных методов?

Что делать, если я хотел сортировать, группируя по первой записи массива в лексикальном порядке, но внутри этой группы я хочу, чтобы отдельные массивы сортировались по обратному лексикальному порядку? Для этого мне нужен второй компаратор для первой предварительной сортировки записей второго индекса каждого массива?

Вот что я хочу, чтобы получить для этого примера:

[Arbiter, 3812 Gammacity] 
[Arbiter, 1812 Deltacity] 
[MiningCorp, 6454 Iotacity] 
[MiningCorp, 2265 Betacity] 
[MiningCorp, 1234 Thetacity] 

ответ

2

Если java8 вариант , чем я бы использовал метод thenComparing для объединения двух спецификаторов сортировки.

При использовании reversed результат сравнения будет перевернут.

Пример кода:

// turn your list into a stream 
workingSet.stream() 

// sort it... 
.sorted(

    // first sort specifier: 0th element of Array 
    Comparator.<String[], String>comparing(composite -> composite[0]) 

     // combine sort specifiers 
     .thenComparing(

       // second sort specifier: 2st element of Array 
       Comparator.<String[], String>comparing(composite -> composite[1]) 

       // REVERSED! 
       .reversed() 
     ) 
    ) 

// convert each array to a String 
.map(Arrays::toString) 

// print each String 
.forEach(System.out::println); 
2

Что делать, если я хотел разобраться, группируя по первой записи массива в lexicalic порядке, но в этой группе я хочу, чтобы отдельные массивы для сортировки по обратному лексикальному порядку?

Тогда вам нужно реализовать Comparator по-разному:

Comparator<String[]> secondComparator = new Comparator<String[]>() { 
     @Override 
     public int compare(String[] first, String[] second) { 
      int compareFirstPart = first[0].compareTo(second[0]); 
      if(compareFirstPart != 0) 
       return compareFirstPart; 
      else 
       return second[1].compareTo(first[1]); // Inverse! 
     } 
    }; 
1

Если вы используете Java 8, вы можете использовать лямбда-выражения, а также:

Collections.sort(workingSet, (first, second) -> { 
      int compareFirstPart = first[0].compareTo(second[0]); 
      if(compareFirstPart != 0) 
       return compareFirstPart; 
      else 
       return second[1].compareTo(first[1]); 
}); 
+0

в то время как лямбда-выражения не являются совершенно новым для меня, это делает его более ясным для меня, как они работают в Java. Спасибо за ваш ответ. –