2016-02-12 40 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,你可以使用lambda表达式,以及:

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

而lambda表达式不适合我全新的,这使得它更清晰的对我来说,他们在java中是如何工作的。谢谢您的回答。 –