![](/img/trans.png)
[英]How do I sort lexicographically with sorted(comparator) method?
[英]How do I sort an ArrayList lexicographically?
我正在嘗試對表示卡值的字符串ArrayList進行排序。 因此,有些卡包含字母(“King”),有些包含僅包含數字(“7”)的字符串。 我知道使用Collections.sort,但它只對包含字母的字符串進行排序。 如何按行編號和按字母順序對ArrayList進行排序?
編輯:對不起,當我查看排序時,我一定不會太注意。 排序正常,我必須被一個10來到2之前的事實所拋棄。謝謝
不, Collections.sort
將使用Unicode序數詞典比較對所有內容進行排序,因為這是String.compareTo
的行為。 “7”將出現在“King”之前,“10”將出現在“2”之前。
據我所知,你有一個像["7", "Queen", "9", "6"]
的數組,你希望它看起來像["Queen", "9", "7", "6"]
(或以相反的順序)在完成排序之后。
我建議讓它更加面向對象,即創建帶有字段名稱和值的類卡:
class Card {
private final String name;
private final int value;
...
//constructor and getters
}
然后以這種方式創建實例:
Card six = new Card("6", 6);
Card ten = new Card("10", 10);
Card queen = new Card("Queen", 12);
在此之后,使用字段value
而不是卡片名稱進行卡片(並特別是排序)的所有操作將更加容易。
正如@Jon Skeet所說,內置排序將根據Unicode值進行比較。 你必須編寫自己的排序方法。
但是,只要您編寫自己的代碼,我可以建議一個枚舉嗎? 一副牌是使用枚舉的規范示例之一。 簡短版本是您可以為一組事物聲明自己的排序順序; 如果你願意的話,你甚至可以讓黑桃王超過鑽石之王。 在這里查看Sun的教程。
我知道使用Collections.sort,但它只對包含字母的字符串進行排序。 如何按行編號和按字母順序對ArrayList進行排序?
如果字符串是一個數字,它已經被排序(作為一個字符串)看起來:
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 );
}
}
打印
$ java Sort
[3.1416, 7, Abcd, Kings]
這就是你需要的嗎?
編輯
假設(猜測)你需要的是對一副卡片進行排序,這些卡片同時具有數字和“字母”(J,Q,K,A),你可以嘗試使用自定義比較器。
這是一個考慮數字“作為數字”,其余的作為字符串,所以“10”在“2”之后,但在“國王”之前
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]
如果這就是你所需要的,我猜這可以幫助你弄清楚剩下的。 可能接下來的事情是如何對黑桃與心臟進行排序。
按照Roman的回答,您可以創建一個類並實現Comparable接口:
class Card implements Comparable<Card> {
public int compareTo( Card other ) {
// add custom logic to compare one card with other
}
}
排序將根據您的字符集對所有內容進行排序。 換句話說,所有數字都將出現在字典順序中的字母之前。 例如,十進制數字以'。'開頭。 按字典順序排列。
如果要更改此設置,請創建Comparator對象。 然后,您可以按照您喜歡的順序放置項目。
例如,這將按數字順序對數字進行排序,並按詞匯順序對單詞進行排序:
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未經測試!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.