2011-09-27 56 views
16

Tôi muốn đặt hàng một chuỗi ArrayList theo chiều dài, nhưng không chỉ theo thứ tự số.Sắp xếp ArrayList các chuỗi theo chiều dài

Nói ví dụ, danh sách chứa những lời này:

cucumber 
aeronomical 
bacon 
tea 
telescopic 
fantasmagorical 

Họ cần phải được sắp xếp theo sự khác biệt của họ trong thời gian tới một chuỗi đặc biệt, ví dụ:

intelligent 

Vì vậy, danh sách cuối cùng sẽ giống như thế này (sự khác biệt trong ngoặc đơn):

aeronomical  (0) 
telescopic  (1) 
fantasmagorical (3) - give priority to positive differences? doesn't really matter 
cucumber  (3) 
bacon   (6) 
tea    (8) 

Trả lời

27

Sử dụng công cụ so sánh tùy chỉnh:

public class MyComparator implements java.util.Comparator<String> { 

    private int referenceLength; 

    public MyComparator(String reference) { 
     super(); 
     this.referenceLength = reference.length(); 
    } 

    public int compare(String s1, String s2) { 
     int dist1 = Math.abs(s1.length() - referenceLength); 
     int dist2 = Math.abs(s2.length() - referenceLength); 

     return dist1 - dist2; 
    } 
} 

Sau đó, sắp xếp danh sách bằng cách sử dụng java.util.Collections.sort(List, Comparator).

+0

Ưu tiên các khác biệt tích cực có thể được đưa ra bằng cách nhân các khác biệt dương với hai và chênh lệch âm bằng hai âm, sau đó thêm một. –

+0

Bạn nên thực hiện tham chiếu cuối cùng. –

4

Bạn sẽ thực hiện việc này với phiên bản Collections.sort() cần có một số Comparator rõ ràng.

+0

@downvoter - bạn có thích tôi spoonfed câu trả lời, hơn là dạy OP nơi để tìm thông tin? – parsifal

+7

Bị bỏ rơi vì ... ngón tay downvote ngứa? Nó phải là một bình luận? Sworn kẻ thù của parsifal? –

+2

Bị bỏ qua vì nhận xét ở trên: D – user1613360

5
This will help you - String in Ascending order 


class StringLengthListSort implements Comparator<String>{ 

    @Override 
    public int compare(String s1, String s2) { 
    return s1.length() - s2.length(); 
    } 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
    List<String> list = new ArrayList<String>(); 
    StringLengthListSort ss = new StringLengthListSort(); 
    list.add("ram"); 
    list.add("rahim"); 
    list.add("ramshyam"); 
    Collections.sort(list, ss); 
    System.out.println(list); 
    } 

} 
5

Nếu bạn đang sử dụng Java 8 + bạn có thể sử dụng một biểu thức lambda để thực hiện (@ câu trả lời Barend như) so sánh

List<String> strings = Arrays.asList(new String[] {"cucumber","aeronomical","bacon","tea","telescopic","fantasmagorical"}); 
strings.sort((s1, s2) -> Math.abs(s1.length() - "intelligent".length()) - Math.abs(s2.length() - "intelligent".length())); 
+1

Giải pháp tốt nhất cho Java 8+. Ngắn gọn và chính xác. –

-1

Tôi nghĩ rằng giải pháp đề xuất là bất hợp pháp.

Hợp đồng giao diện Comparator yêu cầu phương pháp so sánh phải nhất quán với phương thức equals.

Điều đó có nghĩa là nếu bạn có x.compareTo(y) == 0 thì bạn phải có x.equals(y) == true.

Vì vậy, có thể các giải pháp hoạt động trong thực tế, nhưng chúng không được đảm bảo và có thể vi phạm trong bản phát hành tiếp theo.

+1

Nếu đúng như vậy, bạn không thể tạo các bộ so sánh chuỗi tùy chỉnh *. – Clashsoft

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