2010-06-08 40 views
6

Tôi đang cố gắng sắp xếp một ArrayList của các chuỗi đại diện cho các giá trị thẻ. Vì vậy, một số thẻ chứa chữ cái ("King") và một số chứa các chuỗi chỉ chứa một số ("7"). Tôi biết sử dụng Collections.sort, nhưng nó chỉ sắp xếp các chuỗi chứa các chữ cái. Làm cách nào để có được ArrayList được sắp xếp theo số cũng như theo thứ tự bảng chữ cái?Làm thế nào để sắp xếp một ArrayList theo từ điển?

Chỉnh sửa: Rất tiếc, tôi không được chú ý nhiều khi xem xét sắp xếp. Các loại hoạt động chính xác, tôi phải vừa được ném ra bởi thực tế là 10 sẽ đến trước một 2. Nhờ

+1

"Tôi biết sử dụng Collections.sort, nhưng nó chỉ sắp xếp các chuỗi chứa các chữ cái" uh? – leonbloy

+1

Không chắc chắn những gì bạn đang cố gắng làm, sắp xếp bộ sưu tập sẽ sắp xếp mọi thứ (bao gồm cả "7") theo thứ tự bảng chữ cái. Các số được đặt trước A, vì vậy chúng sẽ kết thúc ở trên cùng. Nếu bạn muốn 7 được lưu trữ dưới "s", bạn sẽ phải tạo một từ điển có thứ gì đó giống như lớp Từ điển bộ sưu tập chung, có chuỗi hiển thị "7" cũng như mã/văn bản đại diện "Bảy" hoặc một cái gì đó như thế. – Cobusve

Trả lời

9

Không, Collections.sort sẽ sắp xếp tất cả mọi thứ, sử dụng một Unicode thứ tự từ điển so sánh như đó là hành vi của String.compareTo. "7" sẽ xuất hiện trước "King" và "10" sẽ xuất hiện trước "2".

+0

yep - http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html#compareTo(java.lang.String) – leonbloy

0

Tôi biết sử dụng Collections.sort, nhưng nó chỉ sắp xếp Strings chứa chữ cái. Làm cách nào để có được ArrayList được sắp xếp theo số cũng như theo thứ tự bảng chữ cái?

Nếu chuỗi được một số nó đã được sắp xếp (như là một chuỗi mặc dù) xem xét:

import java.util.*; 
class Sort { 
    public static void main(String [] args ) { 
     List list = Arrays.asList("Kings","7", "Abcd", "3.1416"); 
     Collections.sort(list); 
     System.out.println(list); 
    } 
} 

Prints

$ java Sort 
[3.1416, 7, Abcd, Kings] 

Là những gì bạn cần?

chỉnh sửa

Giả sử (đoán) những gì bạn cần là để sắp xếp một cỗ bài, trong đó có cả số và "chữ cái" (J, Q, K, A), bạn có thể thử sử dụng một tùy chỉnh so sánh.

Đây là một loại đưa vào xem xét những con số "như số" các phần còn lại như dây đàn, vì vậy "10" xuất phát sau khi "2" nhưng trước khi "Kings"

import java.util.*; 
class Sort { 
    public static void main(String [] args ) { 

     List<String> list = Arrays.asList("Kings","7", "Queen", "3", "10", "A", "2", "8", "Joker"); 
     Collections.sort(list , new Comparator<String>(){ 
      public int compare(String a, String b){ 
       // if both are numbers 
       if(a.matches("\\d+") && b.matches("\\d+")) { 
        return new Integer(a) - new Integer(b); 
       } 
       // else, compare normally. 
       return a.compareTo(b); 
      } 
     }); 
     System.out.println(list); 
    } 
} 

$ java Sort 
[2, 3, 7, 8, 10, A, Joker, Kings, Queen] 

Nếu đó là những gì bạn cần tôi đoán điều này sẽ giúp bạn tìm ra phần còn lại. Có lẽ điều tiếp theo sẽ là làm thế nào để sắp xếp spades so với trái tim.

Sau câu trả lời bằng cách Roman bạn có thể tạo một lớp và thực hiện các giao diện Comparable:

class Card implements Comparable<Card> { 
     public int compareTo(Card other) { 
      // add custom logic to compare one card with other 
     } 
    } 
+0

Nó không phải là những gì anh ta yêu cầu. Tôi nghĩ anh ấy muốn bạn viết Custom Comparator cho tất cả các tên thẻ. –

+0

@Nikita: Tôi hiểu rằng các con số "nghĩ" không bao gồm trong loại. Có lẽ OP cần làm rõ một số. – OscarRyz

0

Sắp xếp sẽ sắp xếp mọi thứ theo charset của bạn. Trong các từ khác, tất cả các số sẽ xuất hiện trước các chữ cái theo thứ tự từ điển. Ví dụ: số thập phân bắt đầu bằng dấu '.' và không theo thứ tự từ điển.

Nếu bạn muốn thay đổi điều này, hãy tạo đối tượng Comparator. Sau đó bạn có thể đặt các vật phẩm theo bất kỳ thứ tự nào bạn thích.

Ví dụ, điều này sẽ sắp xếp các số theo thứ tự số, và cũng từ theo thứ tự từ vựng:

class CardComparator extends Object implements Comparator{ 
public int compare(Object a, Object b){ 
    try{ 
    double d1=Double.valueOf(a.toString()); 
    try{ 
    double d2=Double.valueOf(b.toString()); 
    return (d2>d1)?1:-1;   // both numeric 
    }catch(NumberFormatException e){ // a is numeric but b isn't 
    return 1; 
    } 
    }catch(NumberFormatException e){ 
    try{ 
    double d2=Double.valueOf(b.toString()); 
    return -1;      // a is nonnumeric but b is 
    }catch(NumberFormatException e){ // both nonnumeric 
     return a.toString().compareTo(b.toString); 
    } 
    } 
} 
} 
Comparator comparator=new CardComparator(); 
Collections.sort(cards, comparator); 

PS không được thử nghiệm!

1

Như @Jon Skeet cho biết, loại được tích hợp sẽ so sánh dựa trên giá trị Unicode. Bạn sẽ phải viết phương pháp phân loại của riêng bạn.

Tuy nhiên, miễn là bạn đang viết mã của riêng mình, tôi có thể đề xuất một điều tra không? Một cỗ bài là một trong những ví dụ kinh điển để sử dụng enums. Phiên bản ngắn là bạn có thể khai báo thứ tự sắp xếp của riêng bạn cho một nhóm thứ; bạn thậm chí có thể làm cho vua của spades outrank vua kim cương, nếu bạn muốn. Xem hướng dẫn của Sun here.

4

Như tôi hiểu, bạn có một mảng như ["7", "Queen", "9", "6"] và bạn muốn nó trông giống như ["Queen", "9", "7", "6"] (hoặc theo thứ tự ngược lại) sau khi sắp xếp xong.

tôi khuyên bạn nên để làm cho nó thêm một chút hướng đối tượng tức là tạo Thẻ lớp với các lĩnh vực tên và giá trị:

class Card { 
    private final String name; 
    private final int value; 
    ... 
    //constructor and getters 
} 

và sau đó tạo ra các trường hợp theo cách này:

Card six = new Card("6", 6); 
Card ten = new Card("10", 10); 
Card queen = new Card("Queen", 12); 

Sau đó nó sẽ dễ dàng hơn nhiều để thực hiện tất cả các hoạt động với thẻ (và phân loại đặc biệt) bằng cách sử dụng trường value thay vì tên thẻ.

+1

'' Theo quy ước, thẻ thường cũng có "phù hợp". '' – fmark

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