2013-05-14 30 views
9

Tôi có một mảng String:Sorting một mảng String với tùy chỉnh lệnh

String[] str = {"ab" , "fog", "dog", "car", "bed"}; 
Arrays.sort(str); 
System.out.println(Arrays.toString(str)); 

Nếu tôi sử dụng Arrays.sort, đầu ra là:

[ab, bed, car, dog, fog] 

Nhưng tôi cần phải thực hiện thứ tự sau đây:

FCBWHJLOAQUXMPVINTKGZERDYS

Tôi nghĩ rằng tôi cần phải im plement Comparator và ghi đè compare phương pháp:

Arrays.sort(str, new Comparator<String>() { 

     @Override 
     public int compare(String o1, String o2) { 
      // TODO Auto-generated method stub 
      return 0; 
     } 
    }); 

Tôi nên giải quyết vấn đề này như thế nào?

+2

Thứ nhất, bạn nên cân nhắc sử dụng mảng ký tự nếu các mục của bạn luôn dài một ký tự. Sử dụng chuỗi buộc kiểm tra lỗi nhiều hơn. –

+0

@DuncanJones Không có họ không, đây chỉ là một ví dụ. Tôi đã thay đổi chúng. Cảm ơn – Sam

+0

@Sam: vì vậy mỗi ký tự riêng lẻ trong chuỗi cần phải được sắp xếp theo thứ tự và sau đó áp dụng quy tắc chuỗi "bình thường"? "AA" được sắp xếp như thế nào so với "A"? Hoặc "FC" liên quan đến "FB"? –

Trả lời

26
final String ORDER= "FCBWHJLOAQUXMPVINTKGZERDYS"; 

Arrays.sort(str, new Comparator<String>() { 

    @Override 
    public int compare(String o1, String o2) { 
     return ORDER.indexOf(o1) - ORDER.indexOf(o2) ; 
    } 
}); 

Bạn cũng có thể thêm:

o1.toUpperCase() 

Nếu mảng của bạn là trường hợp nhạy cảm.


Rõ ràng OP muốn so sánh không chỉ chữ nhưng chuỗi các chữ cái, vì vậy đó là một chút phức tạp hơn:

public int compare(String o1, String o2) { 
     int pos1 = 0; 
     int pos2 = 0; 
     for (int i = 0; i < Math.min(o1.length(), o2.length()) && pos1 == pos2; i++) { 
      pos1 = ORDER.indexOf(o1.charAt(i)); 
      pos2 = ORDER.indexOf(o2.charAt(i)); 
     } 

     if (pos1 == pos2 && o1.length() != o2.length()) { 
      return o1.length() - o2.length(); 
     } 

     return pos1 - pos2 ; 
    } 
+3

cẩn thận: trên/dưới trường hợp nhầm lẫn rất nhiều. –

+0

@JoachimSauer đã thêm chỉnh sửa, cảm ơn –

+1

@MajidL Nếu đó là trường hợp * trong * nhạy cảm? – alex

0

đây bạn có thể tìm thấy liên kết hữu ích:

Using comparator to make custom sort

Trong ví dụ của bạn thay vì so sánh các thuộc tính cụ thể của lớp bạn nedd để kiểm tra sở hữu của char trong chuỗi chuẩn và dựa trên kiểm tra này nếu nó tuyệt vời er/bằng/nhỏ hơn.

3

Tôi sẽ làm một việc như sau:

Đặt các ký tự trong HashTable (hãy gọi nó là orderMap). Khóa là chữ cái, giá trị là chỉ mục trong ORDER.

Và sau đó:

Arrays.sort(str, new Comparator<String>() { 

    @Override 
    public int compare(String o1, String o2) { 
     int length = o1.length > o2.length ? o1.length: o2.length 
     for(int i = 0; i < length; ++i) { 
      int firstLetterIndex = orderMap.get(o1.charAt(i)); 
      int secondLetterIndex = orderMap.get(o2.charAt(i)); 

      if(firstLetterIndex == secondLetterIndex) continue; 

      // First string has lower index letter (for example F) and the second has higher index letter (for example B) - that means that the first string comes before 
      if(firstLetterIndex < secondLetterIndex) return 1; 
      else return -1; 
     } 

     return 0; 
    } 
}); 

Đối với làm cho nó case-insensitive chỉ làm toUpperCase() để cả hai dây lúc đầu.

0

Hãy dành thời gian để cải thiện câu trả lời đã chọn. Điều này hiệu quả hơn

public static void customSort(final String order,String[] array){ 
String[] alphabets={"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","0","1","2","3","4","5","6","7","8","9"}; 
    String keyword=order; 
    for(int g=0; g<alphabets.length; g++){ 
    String one=alphabets[g]; 
    if(!keyword.toUpperCase().contains(one)){keyword=keyword+one;} 
    } 

final String finalKeyword=keyword; 
Arrays.sort(array, new Comparator<String>() { 

    @Override 
    public int compare(String o1, String o2) { 
     int pos1 = 0; 
     int pos2 = 0; 
     for (int i = 0; i < Math.min(o1.length(), o2.length()) && pos1 == pos2; i++) { 
      pos1 = finalKeyword.toUpperCase().indexOf(o1.toUpperCase().charAt(i)); 
      pos2 = finalKeyword.toUpperCase().indexOf(o2.toUpperCase().charAt(i)); 
     } 

     if (pos1 == pos2 && o1.length() != o2.length()) { 
      return o1.length() - o2.length(); 
     } 

     return pos1 - pos2 ; 
    } 
}); 
//Arrays.sort(array, Collections.reverseOrder()); 
} 
Các vấn đề liên quan