2011-04-28 147 views
95

我有一個字符串arraylist names其中包含人的名字。我想按字母順序排列數組列表。按字母順序排列arraylist(不區分大小寫)

ArrayList<String> names = new ArrayList<String>(); 
names.add("seetha"); 
names.add("sudhin"); 
names.add("Swetha"); 
names.add("Neethu"); 
names.add("ananya"); 
names.add("Athira"); 
names.add("bala"); 
names.add("Tony"); 
names.add("Karthika"); 
names.add("Nithin"); 
names.add("Vinod"); 
names.add("jeena"); 
Collections.sort(names); 
for(int i=0; i<names.size(); i++) 
    System.out.println(names.get(i)); 

我試着用上面的方法對列表進行排序。但它顯示的排序陣列爲:

Athira 
Karthika 
.. 
.. 
ananya 
bala 
... 

但我不想讓它區分大小寫。我想要的結果爲:

ananya 
Athira 
bala 

回答

268

定製Comparator應該幫助

Collections.sort(list, new Comparator<String>() { 
    @Override 
    public int compare(String s1, String s2) { 
     return s1.compareToIgnoreCase(s2); 
    } 
}); 

或者,如果您使用的是Java 8:

list.sort(String::compareToIgnoreCase); 
+0

你能告訴我什麼是字符串s1和s2嗎?如果比較函數返回整數,怎麼看結果r值。 – 2011-04-28 08:01:05

+0

沒有注意到發佈前的評論.. – 2011-04-28 08:01:20

+0

@seethalakshmi這是您的列表中的字符串。請看看Collections.sort方法的來源,如果你想得到更多的細節 – 2011-04-28 08:02:35

3

您需要使用將使用compareToIgnoreCase定製的比較,不比較。

+0

我試過這個link.but但我不能找到d解決方案。你可以解釋 – 2011-04-28 08:10:46

167

最簡單的事情做的是:

Collections.sort(list, String.CASE_INSENSITIVE_ORDER); 
+0

@djunod,謝謝你的答案。我也嘗試了從A1到A10的ArrayList解決方案,但是A10沒有像denis.solenenko的解決方案那樣正確排序。不知何故,A10在A1之後。基本上,它像A1,A10,A2,A3等排序。爲什麼發生這種情況,我如何正確排序? – Dante 2014-10-05 16:39:47

+2

@dante,這是正常的字符串排序。如果你想讓A2來到A10之前,你將不得不將它改爲A02等。 – djunod 2014-10-07 22:47:52

+0

加1.也在Android中工作。謝謝並祝賀。 – statosdotcom 2017-05-16 16:14:08

27

試試這個代碼

Collections.sort(yourarraylist, new SortBasedOnName()); 



import java.util.Comparator; 
import com.RealHelp.objects.FBFriends_Obj; 
import com.RealHelp.ui.importFBContacts; 

public class SortBasedOnName implements Comparator 
{ 
public int compare(Object o1, Object o2) 
{ 

    FBFriends_Obj dd1 = (FBFriends_Obj)o1;// where FBFriends_Obj is your object class 
    FBFriends_Obj dd2 = (FBFriends_Obj)o2; 
    return dd1.uname.compareToIgnoreCase(dd2.uname);//where uname is field name 
} 

} 
+3

很好的回答!我認爲如果你將'實現比較器'改爲'實現比較器,並且將比較中的對象類型更改爲FBFriends_Obj,那麼你不需要dd1和dd2,你可以直接在返回語句中使用o1和o2 – FrinkTheBrave 2012-07-19 23:28:54

2

的Java 8開始,你可以使用Stream

List<String> sorted = Arrays.asList(
          names.stream().sorted(
           (s1, s2) -> s1.compareToIgnoreCase(s2) 
         ).toArray(String[]::new) 
        ); 

它得到一個流從那個ArrayList,然後它排序它(忽略案件)。之後,流被轉換爲一個數組,該數組被轉換爲ArrayList

如果打印使用結果:

System.out.println(sorted); 

將得到以下的輸出:基於上述答案

[ananya, Athira, bala, jeena, Karthika, Neethu, Nithin, seetha, sudhin, Swetha, Tony, Vinod] 
5

,我設法比較我的自定義類對象是這樣的:

ArrayList<Item> itemList = new ArrayList<>(); 
... 
Collections.sort(itemList, new Comparator<Item>() { 
      @Override 
      public int compare(Item item, Item t1) { 
       String s1 = item.getTitle(); 
       String s2 = t1.getTitle(); 
       return s1.compareToIgnoreCase(s2); 
      } 

     }); 
相關問題