web-dev-qa-db-ja.com

アルファベット順の配列リストのソート(大文字と小文字を区別しない)

人々の名前を含む文字列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
112
andro-girl

カスタム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);
312
denis.solonenko

最も簡単なことは次のとおりです。

Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
187
djunod

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

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
}

}
29
hacker

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

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

        });
10
Usman

CompareToではなく compareToIgnoreCase を使用するカスタムコンパレータを使用する必要があります。

4
Vladimir Ivanov

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]
2

残念ながら、これまでのすべての回答では、並べ替えに関して"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では、小文字は大文字よりも大きいと見なされます。

CASE_INSENSITIVE_ORDERは"a""A"を等しいと見なすため、アプローチ2はさらに悪化します(比較結果は0)。これにより、ソートが非決定的になります。

アプローチ3(Java.text.Collat​​orを使用)は、"a""A"が等しくないと見なしますが、現在に従って(またはその他の必要な)ロケール。

0
Lars Gendner