2011-10-29 48 views
5

Tôi có một mảng 2D mà tôi muốn sắp xếp dựa trên cột thứ hai. Cột đầu tiên sẽ vẫn được ghép nối với cột thứ hai.Sắp xếp mảng 2D Integer dựa trên một cột

2D-mảng ban đầu như sau (2x10 ma trận):

0 10 
1 9 
2 9 
3 9 
4 15 
5 10 
6 4 
7 8 
8 11 
9 12 

Tôi muốn 2D-mảng trên để được sắp xếp như thế này:

4 15 
9 12 
8 11 
0 10 
5 10 
1 9 
2 9 
3 9 
7 8 
6 4 

Bây giờ, tôi đã cố gắng thích ứng với câu trả lời từ: Sort a two dimensional array based on one column vào mã này:

Arrays.sort(theArray, new Comparator<Integer[]>() 
{ 
    @Override 
    public int compare(Integer[] int1, Integer[] int2) 
    { 
     Integer numOfKeys1 = int1[1]; 
     Integer numOfKeys2 = int2[1]; 
     return numOfKeys1.compareTo(numOfKeys2); 
    } 
}); 

Tuy nhiên, dường như không sắp xếp mảng ở tất cả. Khi in mảng sau khi gọi hàm sort(), mảng nằm trong thứ tự ban đầu của nó.

Tôi cũng đã thử điều chỉnh câu trả lời từ đây: sorting 2D array of String in java nhưng tôi gặp phải vấn đề tương tự.

Tôi đã mắc phải một số lỗi nghiêm trọng khi điều chỉnh các giải pháp này hay mã của tôi có hoạt động không?

Ngoài ra, tôi sẽ phân loại mảng này theo thứ tự giảm dần như thế nào? Tôi có thể thay thế câu lệnh return trong so sánh() bằng dòng này không?

return -numOfKeys2.compareTo(numOfKeys1); 

Mọi trợ giúp sẽ được đánh giá cao. Cảm ơn!

CHỈNH SỬA: Chỉ cần đăng phần còn lại của mã của tôi để xem sự cố có ở đâu khác không.

public void Sort() 
{ 
    Integer[][] theArray = {{0,10},{1,9},{2,9},{3,9},{4,15},{5,10},{6,4},{7,8},{8,11},{9,12}};; 

    dump(theArray); 
    Arrays.sort(theArray, new Comparator<Integer[]>() 
    { 
     @Override 
     public int compare(Integer[] int1, Integer[] int2) 
     { 
      Integer numOfKeys1 = int1[1]; 
      Integer numOfKeys2 = int2[1]; 
      return numOfKeys1.compareTo(numOfKeys2); 
     } 
    }); 

    System.out.println("===="); 
    dump(theArray);  
} 

public void dump(Integer[][] array) 
{ 
    for(int p = 0, q = 10; p < q; p++) 
    { 
     System.out.println(array[p][0] + " " + array[p][1]); 
    } 
} 

EDIT 2:

Tôi đã có nó làm việc. Cảm ơn tất cả mọi người đã giúp đỡ của bạn. Tôi đã có nhiều hàm Sort() (một hàm cũ không hoạt động, và cái bạn nhìn thấy ở trên), và hóa ra tôi đã gọi sai, mặc dù tôi nghĩ rằng tôi đã thay đổi cuộc gọi. Chỉ một của những ngày.

Hãy sử dụng mã ở trên nếu bạn muốn sắp xếp một mảng. Nó hoàn toàn hoạt động ngay bây giờ.

+0

Mã đó không được chạy; mảng mảng có một mảng đơn với một bó gồm hai mảng phần tử trong nó, bạn đang xử lý nó như là một mảng của hai mảng mười phần tử khi bạn in nó. –

+0

Bạn nói đúng, tôi đã nhận được các chỉ số của tôi trộn lẫn. Cảm ơn vì đã sửa tôi. Và cảm ơn sự giúp đỡ của bạn. – Drake

Trả lời

1

Nó hoạt động tốt cho tôi. Để đảo ngược thứ tự, bạn sẽ từ chối các biến số compareTo, hoặc ban đầu, nhưng không được phép thay đổi cả hai.

Có thể chúng tôi sẽ cần xem phần còn lại của mã để hiểu lý do bạn nhìn thấy những gì bạn đang thấy; Tôi cắt và dán nguyên văn mã của bạn, do đó, tỷ lệ cược là tốt vấn đề nằm ở nơi khác.


dump(theArray); 
Arrays.sort(theArray, new Comparator<Integer[]>() { 
    public int compare(Integer[] int1, Integer[] int2) { 
     Integer numOfKeys1 = int1[1]; 
     Integer numOfKeys2 = int2[1]; 
     return numOfKeys1.compareTo(numOfKeys2); 
    } 
}); 
System.out.println("================"); 
dump(theArray); 


0 10 
0 10 
1 9 
2 9 
3 9 
4 15 
5 10 
6 4 
7 8 
8 11 
9 12 
================ 
6 4 
7 8 
1 9 
2 9 
3 9 
0 10 
0 10 
5 10 
8 11 
9 12 
4 15 
+0

Cảm ơn bạn đã thử nghiệm chức năng sắp xếp() của tôi. Tôi sẽ đăng phần còn lại của mã của tôi ngay bây giờ. – Drake

+0

Giải thích hay. – gurubelli

1

Mã việc cho tôi quá. Xin lỗi vì mã lộn xộn, tôi phải làm một bài kiểm tra nhanh. Trân trọng!

import java.util.*; 

class arraysort { 

    public static Integer[][] mysort(Integer[][] ar) { 
     Arrays.sort(ar, new Comparator<Integer[]>() { 
      @Override 
      public int compare(Integer[] int1, Integer[] int2) { 
       Integer numOfKeys1 = int1[1]; 
       Integer numOfKeys2 = int2[1]; 
       return numOfKeys1.compareTo(numOfKeys2); 
      } 
     }); 
     return ar; 
    } 

    public static void main(String[] s) { 
     Integer[][] myarr = {{0, 10}, {1, 9}, {2, 9}, {3, 9}, {4, 15}, {5, 10}, {6, 4}}; 

     for (Integer[] i : myarr) { 
      System.out.println(i[0] + "," + i[1]); 
     } 

     myarr = mysort(myarr); 

     for (Integer[] i : myarr) { 
      System.out.println(i[0] + "," + i[1]); 
     } 
    } 
} 
+0

Cảm ơn bạn, chương trình hiện đang hoạt động. – Drake

0

Tôi cũng chạy mã của bạn hoàn toàn và nó hoạt động ...một điều mặc dù tôi đã phải thay thế

System.out.println(array[0][p] + " " + array[1][p]); 

với

System.out.println(array[p][0] + " " + array[p][1]); 

để chạy mã bởi vì nếu không nó mang lại một chỉ số mảng nằm ngoài giới hạn ngoại lệ.

Bỏ qua sự so sánh trở lại dễ dàng hơn so với trao đổi các giá trị và cho phép thay đổi dễ dàng.

+0

Cảm ơn bạn, các chỉ số của tôi đã bị lẫn lộn. Tôi đã có chương trình của tôi làm việc ngay bây giờ. – Drake

Các vấn đề liên quan