我正在尝试对代表卡片值的字符串数组列表进行排序。因此,有些卡片包含字母(“King”),有些包含仅包含数字的字符串(“7”)。我知道使用 Collections.sort,但它只对包含字母的字符串进行排序。如何让 ArrayList 按数字和字母顺序排序?
编辑:对不起,当我查看排序时,我一定没有太注意。排序工作正常,我一定是因为 10 会在 2 之前出现这一事实而被抛弃。谢谢
我正在尝试对代表卡片值的字符串数组列表进行排序。因此,有些卡片包含字母(“King”),有些包含仅包含数字的字符串(“7”)。我知道使用 Collections.sort,但它只对包含字母的字符串进行排序。如何让 ArrayList 按数字和字母顺序排序?
编辑:对不起,当我查看排序时,我一定没有太注意。排序工作正常,我一定是因为 10 会在 2 之前出现这一事实而被抛弃。谢谢
不,Collections.sort
将使用 Unicode 序数词典比较对所有内容进行排序,因为这是String.compareTo
. “7”将出现在“King”之前,“10”将出现在“2”之前。
据我了解,您有一个类似的数组,["7", "Queen", "9", "6"]
并且您希望它["Queen", "9", "7", "6"]
在排序完成后看起来像(或以相反的顺序)。
我建议让它更加面向对象,即创建带有字段名称和值的类 Card:
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 值进行比较。您必须编写自己的排序方法。
但是,只要您编写自己的代码,我可以建议枚举吗?一副纸牌是使用枚举的典型示例之一。简短的版本是您可以为一组事物声明自己的排序顺序;如果您愿意,您甚至可以让黑桃 K 的排名超过方块 K。在此处查看 Sun 的教程。
Sort 将根据您的字符集对所有内容进行排序。换句话说,所有数字都将在字典顺序中出现在字母之前。例如,十进制数字以“.”开头。并且按字典顺序乱序。
如果要更改此设置,请创建 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未测试!
我知道使用 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”之后但在“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]
如果这就是您所需要的,我想这将帮助您弄清楚其余部分。接下来的事情可能是如何对黑桃和红桃进行排序。
按照Roman的回答,您可以创建一个类并实现Comparable接口:
class Card implements Comparable<Card> {
public int compareTo( Card other ) {
// add custom logic to compare one card with other
}
}