2010-06-08 73 views
6

我想排序代表卡片值的字符串ArrayList。所以,一些卡片包含字母(“国王”),一些包含只包含一个数字(“7”)的字符串。我知道使用Collections.sort,但它只对包含字母的字符串进行排序。如何让ArrayList按照数字和字母排序?如何按照字典顺序排列ArrayList?

编辑:对不起,当我看着分拣时,我一定不会太在意。排序正常工作,我必须刚刚被抛出的事实,即10将在2之前。谢谢

+1

“我知道使用Collections.sort,但它只对包含字母的字符串进行排序”呃? – leonbloy 2010-06-08 16:14:49

+1

不确定你要做什么,排序集合将按字母顺序对所有内容(包括“7”)进行排序。数字放在A之前,所以它们最终位于顶部。 如果你想让7存储在“s”下,你将不得不创建一个类似Generic Collections字典类的字典,它具有显示字符串“7”以及代码/文本表示“Seven”,或者类似的东西。 – Cobusve 2010-06-08 16:15:18

回答

9

不,Collections.sort将排序的一切,使用Unicode序数字典对比,因为这是String.compareTo的行为。 “7”将在“国王”之前出现,“10”将在“2”之前出现。

+0

是的 - http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html#compareTo(java.lang.String) – leonbloy 2010-06-08 16:17:33

0

我知道使用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 
     } 
    } 
+0

这不是他要问的。我认为他希望你为所有名片编写自定义比较器。 – 2010-06-08 16:16:00

+0

@Nikita:我知道他“认为”数字不包括在内。 OP可能需要一些澄清。 – OscarRyz 2010-06-08 16:17:24

0

排序会根据您的字符集排序的一切。换句话说,所有数字都会以字典顺序出现在字母之前。例如,十进制数字以'。'开头。并按字母顺序排列。

如果你想改变这个,使比较对象。然后你可以按照你喜欢的顺序放置物品。

例如,这将词汇顺序排序按照数字顺序编号,也话:

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未测试!

1

正如@Jon Skeet所说,内置排序将根据Unicode值进行比较。你必须编写自己的排序方法。

但是,只要你正在编写你自己的代码,我可以建议一个枚举?一副纸牌是使用枚举的典型例子之一。简短的版本是你可以为一组事物声明自己的排序顺序;如果你想的话,你甚至可以让黑桃王超越钻石之王。查看Sun的教程here

4

据我所知,你有一个数组像["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而不是卡片的名称进行所有卡片操作(尤其是分类)会容易得多。

+1

''作为一项惯例,卡通常也有“套装”。 '' – fmark 2010-06-08 16:31:49