arraylistをアルファベット順にソートする(大文字と小文字は区別されません)


121

names人の名前を含む文字列arraylistがあります。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

回答:


330

カスタム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);

1
文字列s1とs2とは何ですか?比較関数が整数値を返す場合、結果をどのように見ることができますか?
andro-girl

@seethalakshmiそれはあなたのリストからの文字列です。詳細については、Collections.sortメソッドのソースをご覧ください
denis.solonenko

ソートされたリストをlogcatに表示したいのですが、どうすればよいですか?
andro-girl

ソート後にリストをループで分解しない限り、オブジェクトとして表示されます。for (TYPE newvariable : ARRAYTYPE arrayname) { Log.i("YOURAPPTAG", newvariable); }
放棄されたカート

2
@Danteのhtheの実装を見ると、長さが小さいという理由だけでString.CASE_INSENSITIVE_ORDER、A1がlessA10よりも制限されていることがわかります。ない「自然なソート」箱から出してサポートはありませんが、あなたが見てとることをお勧めしますstackoverflow.com/questions/1262239/...を
denis.solonenko

195

最も簡単なことは:

Collections.sort(list, String.CASE_INSENSITIVE_ORDER);

@djunod、答えてくれてありがとう。A1からA10までのArrayListのソリューションも試しましたが、A10はdenis.solenenkoのソリューションのように正しくソートされませんでした。どういうわけか、A10はA1の後に続きます。基本的に、それはA1、A10、A2、A3などのようにソートされました。なぜそれが起こったのですか、どうすればリストを正しくソートできますか?
Dante

2
@dante、それは通常の文字列ソートです。あなたはA2はA10の前に来てほしい場合は、など、A02にそれを変更する必要があります
djunod

1
プラス1. Androidでも動作しました。おかげで、おめでとうございます。
statosdotcom

@djunod Uに感謝します:)
Kumar

stackoverflowのは、私にこのような答え/スニペットを保存するオプション..提供しなければならない
HBを。

29

このコードを試してください

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
正解です。'implements Comparator'を 'implements Comparator <FBFriends_Obj>に変更し、compareのオブジェクトタイプをFBFriends_Objに変更すると、dd1とdd2は不要になり、returnステートメントで直接o1とo2を使用できます
FrinkTheBrave

11

上記の回答に基づいて、次のようにカスタムクラスオブジェクトを比較することができました。

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);
            }

        });


3

あなたが使用できる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]

3

残念ながら、これまでのすべての回答は、ソートに関しては"a"同等と見なしてはならないことを考慮に入れていません"A"

String[] array = {"b", "A", "C", "B", "a"};

// Approach 1
Arrays.sort(array);
// array is [A, B, C, a, b]

// Approach 2
Arrays.sort(array, String.CASE_INSENSITIVE_ORDER);
// array is [A, a, b, B, C]

// Approach 3
Arrays.sort(array, java.text.Collator.getInstance());
// array is [a, A, b, B, C]

アプローチ1では、小文字は大文字よりも大きいと見なされます。

アプローチ2では、CASE_INSENSITIVE_ORDERが考慮し"a""A"等しい(比較結果は0)ため、状況はさらに悪化します。これにより、ソートが不確定になります。

アプローチ3(java.text.Collat​​orを使用)は、同等であると見なし"a""A"等しくないため、正しく行う唯一の方法ですが、現在の(またはその他の望ましい)ロケールに従って正しい順序で配置します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.