2010-08-04 78 views
9

Làm cách nào để sắp xếp một mảng theo chiều dài, sau đó theo thứ tự bảng chữ cái?Sắp xếp mảng đầu tiên theo chiều dài rồi theo thứ tự bảng chữ cái trong Java

Tôi có một danh sách những thứ với những con số trên chúng, và tôi hiện đang nhận được:

Something1 Something10 Something2 Something3

Trong khi tôi muốn nhận được:

Something1 Something2 Something3 Something10

+1

Bởi cơ hội nào, bài tập về nhà? –

+0

Không, chỉ cần có rất nhiều tệp tôi muốn đổi tên nhanh chóng. Chúng được đánh số, nhưng các số cần được dịch chuyển một chút và phần còn lại của tên tập tin thay đổi xung quanh. Nhưng thứ tự tự nhiên của hệ điều hành thường trả về 1 10 11 12 13 14 15 16 17 18 19 2 20 v.v. – Brian

+1

Bạn đã thử sử dụng các số 0 hàng đầu trong các số của mình chưa? IE, 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11. –

Trả lời

24
public class MyComparator implements Comparator<String>{ 
    @Override 
    public int compare(String o1, String o2) { 
     if (o1.length() > o2.length()) { 
     return 1; 
     } else if (o1.length() < o2.length()) { 
     return -1; 
     } 
     return o1.compareTo(o2); 
    } 
} 

Sau đó sử dụng:

Collections.sort(yourList, new MyComparator()); 
+0

Phép so sánh yêu cầu int compareTo (Obj o), không so sánh (Object o1, Object o2). Mã này là gần mặc dù. – Starkey

+3

@Starkey: So sánh. Đây là Comparator. Bạn đã gần mặc dù. –

+0

Cảm ơn, tôi chỉ cần sắp xếp một số tên tệp có số trong chúng thật nhanh và đổi tên chúng. Tôi đã có chúng trong một Array vì vậy tôi đã phải chuyển đổi nó thành một Bộ sưu tập, nhưng điều này làm việc cho mục đích của tôi. Cảm ơn! – Brian

4

Tạo Bộ so sánh so sánh theo độ dài trước và nếu độ dài giống nhau, hãy sử dụng String.compareTo ().

+0

Cũng lưu ý sự tồn tại của 'compareToIgnoreCase()'. –

1

Phân loại đầu tiên theo chiều dài và sau đó giải nghĩa từ vựng sẽ làm việc ONLY nếu các tiền tố chuỗi (ví dụ: phần trước số) là độ dài như nhau trong mọi trường hợp. Tôi tin rằng bạn thực sự có thể muốn viết một bộ so sánh tách chuỗi và các phần số và sắp xếp theo thứ tự bảng chữ cái trên chuỗi và số trên phần số.

0

Xác định một lớp để giữ mục của bạn. Có vẻ như bạn muốn nó là một Chuỗi.

Đối với lớp đó, bạn cần xác định giao diện Có thể so sánh và đặt logic để so sánh theo phương pháp trừu tượng của nó.

 
int compareTo(T o) 

Ví dụ:

 
class MyString extends String 
{ 
    @Override 
    int compareTo(Object obj) 
    { 
    // put your logic in here. 
    // Return -1 if this is "less than" obj. 
    // Return 0 if this is equal to obj 
    // Return 1 if this is "greater than" obj. 

    // Test length first 
    if (length() < obj.length()) 
     return -1; 
    if (length() > obj.length()) 
     return 1; 

    // Lengths are the same, use the alphabetical compare defined by String already 
    return super.compareTo(obj); 
    } 
} 

Disclaimer, tôi không thực sự kiểm tra mã này, nhưng nó phải được gần gũi với những gì bạn muốn.

7

Dưới đây là một giải pháp ngắn gọn Java 8:

List<String> list = Arrays.asList("Something1", "Something10", "Something2", "Something3"); 
list.sort(Comparator.comparing(String::length).thenComparing(String::compareTo)); 

Hoặc, case-insensitive phiên bản:

list.sort(Comparator.comparing(String::length).thenComparing(String::compareToIgnoreCase)); 
Các vấn đề liên quan