2011-01-15 107 views
12

Cách tốt nhất để sắp xếp một ArrayList<String[]> trong Java là gì?Sắp xếp ArrayList of Array trong Java

đâu String [] là ...

String[] = new String[] { "abc", "abc", "abc", "abc", "abc", "abc", "abc" }; 

Bây giờ tôi muốn sắp xếp toàn bộ ArrayList bằng giá trị thứ 2 của String [] (tại chỉ số 1). Tôi cần phải lặp qua mỗi và mọi Chuỗi [] và sau đó con của nó tại chỉ mục 1.

Bất kỳ ý tưởng nào?

EDITED


Tôi có mô tả hơn. Tôi thực sự nhận được các trường học từ một số tệp XML và mỗi nút trong XML có 7 thuộc tính. Bây giờ tôi đang tạo một ArrayList của String [] đang giữ các nút trường đó từ XML và String [] mảng chính nó đang giữ các thuộc tính của nút cụ thể.

Bây giờ, cách tôi muốn sắp xếp nó là, nó nên sắp xếp theo trạng thái của trường là thuộc tính thứ 2 trong XML và chỉ mục 1 trong String [] bên trong ArrayList.

Tôi cần lặp qua từng trường một (nút trong XML, String [] trong Java) và sau đó tôi sẽ phải lọc trạng thái (thuộc tính trạng thái trong XML, chuỗi [1] trong Java).

Bây giờ đã rõ chưa?

+3

Tôi không thấy bất kỳ ArrayList bất cứ nơi nào, và tất cả mọi thứ trong chuỗi của bạn mảng là giống nhau ... – BoltClock

+1

Hãy thử giải thích nó một chút tương lai, đăng một số thông số đầu vào và kết quả ngoại trừ. – Crozin

Trả lời

28

Bắt đầu với Collections.sort, the one that takes a custom Comparator. Bạn cũng cần phải viết một tuỳ chỉnh Comparator cho điều này.

Ví dụ, giả sử bạn muốn dựa vào trật tự tự nhiên của Strings theo quy định tại phương thức compareTo của họ:

public static void main(String[] args) throws Exception { 
     ArrayList<String[]> listOfStringArrays = new ArrayList<String[]>(); 
     listOfStringArrays.add(new String[] {"x","y","z"}); 
     listOfStringArrays.add(new String[] {"a","b","c"}); 
     listOfStringArrays.add(new String[] {"m","n","o"}); 
     Collections.sort(listOfStringArrays,new Comparator<String[]>() { 
      public int compare(String[] strings, String[] otherStrings) { 
       return strings[1].compareTo(otherStrings[1]); 
      } 
     }); 
     for (String[] sa : listOfStringArrays) { 
      System.out.println(Arrays.toString(sa)); 
     } 
     /* prints out 
      [a, b, c] 
      [m, n, o] 
      [x, y, z] 
     */ 

    } 
3

Bạn viết một số Comparator so sánh hai số String[] với đúng con, sau đó bạn chuyển nó đến Collections.sort(List<T> list, Comparator<? super T> c).

4

Bạn tạo một Comparator<String[]> như vậy:

new Comparator<String[]>() { 
    public int compare(String[] first, String[] second) { 
    return first[1].compareTo(second[1]); 
    } 
} 

sau đó vượt qua nó để Collections.sort().

Bạn có thể muốn thực hiện kiểm tra xem phần tử thứ hai có thực sự xuất hiện trong mảng hay không. Bạn cũng có thể thực hiện so sánh tùy chỉnh nếu so sánh Chuỗi chuẩn không đủ.

+0

Tôi đang suy nghĩ làm thế nào nó sẽ sắp xếp toàn bộ ArrayList của Nhà nước theo thứ tự tăng dần? – Neutralizer

+1

Nó sẽ theo thứ tự tăng dần theo cách mà cả Jorn và tôi đã trình bày nó. nếu bạn muốn nó theo thứ tự khác, thì bạn có thể phủ nhận giá trị được trả về từ String.compareTo (String) hoặc chỉ gọi Collections.reverse (yourList) sau khi bạn đã sắp xếp lần đầu tiên. – whaley

0

Dựa trên chỉnh sửa của bạn: Chuỗi của bạn [] phải là đối tượng Trường học để chứa các thuộc tính của bạn. Làm cho đối tượng School của bạn thực hiện Comparable và cho phép sắp xếp dễ dàng với Collections.sort().

0

Điều này cực kỳ dễ thực hiện với Java 8.Chỉ cần viết:

list.sort(Comparator.comparing(a -> a[1])); 

Ví dụ, đoạn mã sau:

List<String[]> list = Arrays.asList(
    new String[] { "abc", "abc", "abc", "abc", "abc", "abc", "abc" }, 
    new String[] { "xyz", "xyz", "xyz", "xyz", "xyz", "xyz", "xyz" }, 
    new String[] { "fgh", "fgh", "fgh", "fgh", "fgh", "fgh", "fgh" }); 

list.sort(Comparator.comparing(a -> a[1])); 
list.stream().map(Arrays::toString).forEach(System.out::println); 

sẽ mang lại kết quả mong muốn:

[abc, abc, abc, abc, abc, abc, abc] 
[fgh, fgh, fgh, fgh, fgh, fgh, fgh] 
[xyz, xyz, xyz, xyz, xyz, xyz, xyz] 
Các vấn đề liên quan