簡體   English   中英

如何按字典順序對ArrayList進行排序?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM