2011-10-24 40 views
11

Thứ tự từ điển được xác định trong Java, đặc biệt là tham chiếu đến các ký tự đặc biệt như !, . và như vậy?Thứ tự Lexicographic trong Java

Lệnh examplary thể được tìm thấy here

Nhưng làm thế nào Java định nghĩa nó là trật tự? Tôi hỏi vì tôi sắp xếp các chuỗi trên Java và trên Oracle và đưa ra các kết quả khác nhau và không thể tìm thấy đặc điểm kỹ thuật cho thứ tự từ điển.

+0

Nếu bạn cần thay đổi thứ tự cho các ngôn ngữ tự nhiên hoặc để phù hợp với Oracle đặt hàng thấy java.text.Collator. – EJP

Trả lời

24

Từ các tài liệu cho String.compareTo:

So sánh hai chuỗi thứ tự từ điển. So sánh dựa trên giá trị Unicode của mỗi ký tự trong chuỗi.

Đây là định nghĩa của trật tự tự từ điển. Nếu hai chuỗi khác nhau, thì chúng có các ký tự khác nhau ở một số chỉ mục là một chỉ mục hợp lệ cho cả hai chuỗi hoặc độ dài của chúng khác nhau hoặc cả hai. Nếu chúng có các ký tự khác nhau tại một hoặc nhiều vị trí chỉ mục, hãy để k là chỉ số nhỏ nhất như vậy; sau đó chuỗi có ký tự ở vị trí k có giá trị nhỏ hơn, được xác định bằng cách sử dụng toán tử <, theo thứ tự từ trước chuỗi khác. Trong trường hợp này, compareTo trả về sự khác biệt của hai giá trị ký tự tại vị trí k trong hai chuỗi [...]

Vì vậy, về cơ bản, nó xử lý từng chuỗi như một chuỗi số nguyên không dấu 16 bit. Không có nhận thức văn hóa, không có sự hiểu biết về các nhân vật phức hợp, vv Nếu bạn muốn có một loại phân loại phức tạp hơn, bạn nên xem Collator.

2

từ javadocs:

Việc so sánh dựa trên giá trị Unicode của mỗi nhân vật trong chuỗi.

chi tiết hơn:

Đây là định nghĩa của trật tự tự từ điển. Nếu hai chuỗi là khác nhau, thì hoặc chúng có các ký tự khác nhau tại một số chỉ mục là chỉ mục hợp lệ cho cả hai chuỗi hoặc độ dài của chúng khác nhau hoặc cả hai. Nếu chúng có các ký tự khác nhau tại một hoặc nhiều vị trí chỉ mục, hãy k là chỉ số nhỏ nhất như vậy; sau đó chuỗi có ký tự ở vị trí k có giá trị nhỏ hơn, được xác định bằng cách sử dụng toán tử <, theo thứ tự từ trước chuỗi khác. Trong trường hợp này, compareTo trả phần chênh lệch của hai giá trị nhân vật ở vị trí k trong hai chuỗi ...

7

trong Java nó dựa trên giá trị Unicode của chuỗi:

http://download.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#compareTo(java.lang.String)

Trong Oracle, nó sẽ phụ thuộc vào bộ ký tự bạn đang sử dụng trên cơ sở dữ liệu của bạn. Bạn sẽ muốn nó là UTF-8 để có hành vi nhất quán với Java.

Để kiểm tra bộ ký tự:

SQL> SELECT parameter, value FROM nls_database_parameters 
    WHERE parameter = 'NLS_CHARACTERSET'; 

PARAMETER    VALUE 
------------------ --------------------- 
NLS_CHARACTERSET  UTF8 

Nếu nó không phải là UTF-8, sau đó bạn có thể nhận được hành vi so sánh khác nhau tùy thuộc vào nhân vật thiết lập cơ sở dữ liệu Oracle của bạn đang sử dụng.

+2

Mặc dù nhận xét này đã giúp tôi nhiều nhất, nhưng tôi đã đánh dấu câu trả lời @jonskeet là chính xác vì câu trả lời của câu hỏi. Nó chỉ ra rằng cơ sở dữ liệu sử dụng mã hóa 'alutf8' (mặc định) và không phải' utf8'. Đối với mục đích thử nghiệm, tôi thiết lập một cơ sở dữ liệu bằng cách sử dụng 'utf8' và mọi thứ đã được sắp xếp như mong đợi. 'đơn hàng alutf8'". " sau ký tự (Đó là chữ "M" đối với tôi) trong khi sử dụng 'utf8' dẫn đến". " đặt hàng trước "M". Rất phiền phức. – oschrenk

0

Hy vọng điều này sẽ giúp ích !!

Nhân viên được sắp xếp dựa trên thứ tự giảm dần của điểm số và nếu hai nhân viên khác nhau có cùng điểm số, thì chúng ta cần xem xét tên nhân viên để sắp xếp theo từ điển.

nhân viên thực hiện lớp: (sử dụng giao diện Comparable cho trường hợp này.)

@Override 
public int compareTo(Object obj) { 
    Employee emp = (Employee) obj; 

    if(emp.getScore() > this.score) return 1; 
    else if(emp.getScore() < this.score) return -1; 
    else 
     return emp.getEmpName().compareToIgnoreCase(this.empName) * -1; 
} 
Các vấn đề liên quan