如何按字典顺序对ArrayList进行排序?

时间:2010-06-08 16:09:44

标签: java string sorting arraylist lexicographic

我正在尝试对表示卡值的字符串ArrayList进行排序。因此,有些卡包含字母(“King”),有些包含仅包含数字(“7”)的字符串。我知道使用Collections.sort,但它只对包含字母的字符串进行排序。如何按照数字和字母顺序对ArrayList进行排序?

编辑:对不起,当我查看排序时,我一定不会太注意。排序正常,我必须被一个10来到2之前的事实所抛弃。谢谢

5 个答案:

答案 0 :(得分:9)

不,Collections.sort将使用Unicode序数词典比较对所有内容进行排序,因为这是String.compareTo的行为。 “7”将出现在“King”之前,而“10”将出现在“2”之前。

答案 1 :(得分: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代替卡片名称,使用卡片进行所有操作(以及特别排序)会更容易。

答案 2 :(得分:1)

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

但是,只要您编写自己的代码,我可以建议一个枚举吗?一副牌是使用枚举的规范示例之一。简短版本是您可以为一组事物声明自己的排序顺序;如果你愿意的话,你甚至可以让黑桃王超过钻石之王。查看Sun的教程here

答案 3 :(得分: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 
       }
   }

答案 4 :(得分:0)

排序将根据您的字符集对所有内容进行排序。换句话说,所有数字都将出现在字典顺序中的字母之前。例如,十进制数字以'。'开头。按字典顺序排列。

如果要更改此设置,请创建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未经测试!