web-dev-qa-db-ja.com

リストをアルファベット順に並べ替えるにはどうすればよいですか。

国名を含むList<String>オブジェクトがあります。このリストをアルファベット順に並べ替えるにはどうすればよいですか。

161
Lennie

それらが文字列であると仮定して、便利な静的メソッドを使用してください sort

 Java.util.Collections.sort(listOfCountryNames)
194
Thilo

Collections.sortによる解決策

あなたがそのリストを使わざるを得ない場合、またはあなたのプログラムが次のような構造を持っている場合

  • リストを作成
  • いくつかの国名を追加
  • 一度ソートする
  • 二度とそのリストを変更しないでください

それならば、Thilosの回答が最善の方法です。 Tom Hawtin - tackline からのアドバイスと組み合わせると、次のようになります。

Java.util.Collections.sort(listOfCountryNames, Collator.getInstance());

TreeSetを使った解決策

あなたが自由に決めることができ、そしてあなたのアプリケーションがもっと複​​雑になるかもしれないなら、あなたは代わりにTreeSetを使うようにあなたのコードを変えるかもしれません。この種のコレクションは、エントリが挿入されたときにそのエントリをソートします。 sort()を呼び出す必要はありません。

Collection<String> countryNames = 
    new TreeSet<String>(Collator.getInstance());
countryNames.add("UK");
countryNames.add("Germany");
countryNames.add("Australia");
// Tada... sorted.

TreeSetが好きな理由に関する補足

これには、微妙な、しかし重要な利点がいくつかあります。

  • それは単に短いです。ただし、1行だけ短くなります。
  • 心配しないでください - このリストは本当に今ソートされています - /TreeSetは常にソートされているので、何をしても関係ありません。
  • 重複したエントリーを持つことはできません。あなたの状況に応じて、これは長所か短所かもしれません。重複が必要な場合は、あなたのリストに固執してください。
  • 熟練したプログラマーはTreeSet<String> countyNamesを見てすぐに次のことを知っています: これは重複のないソートされた文字列の集まりであり、私はこれが毎回真実であることを確信できます 。短い宣言でそんなに多くの情報。
  • 実際のパフォーマンスは場合によっては勝ちます。 Listを使用していて、頻繁に値を挿入し、それらの挿入の間にリストが読み取られる可能性がある場合は、挿入ごとにリストをソートする必要があります。セットは同じことをしますが、それははるかに速くします。

適切なタスクに適切なコレクションを使用することは、短くてバグのないコードを書くための鍵です。このケースではそれほど実演的ではありません、なぜならあなたはただ1行を保存するからです。しかし、私は誰かがListが重複していないことを確認したいときにListを使っているのを見て、それから自分自身でその機能を構築するのをやめました。さらに悪いことに、本当に地図が必要なときに2つのリストを使うことです。

誤解しないでください。Collections.sortを使用してもエラーや問題にはなりません。しかし、TreeSetがはるかにきれいな場合がたくさんあります。

137
Lena Schimmel

Java 8 StreamまたはGuavaを使用して、新しいソートコピーを作成できます。

// Java 8 version
List<String> sortedNames = names.stream().sorted().collect(Collectors.toList());
// Guava version
List<String> sortedNames = Ordering.natural().sortedCopy(names); 

もう1つの選択肢は、Collections APIを介してインプレースソートすることです。

Collections.sort(names);
26

決して遅刻しないでください。これが私たちができることです(学習目的のためだけに) -

import Java.util.List;
import Java.util.ArrayList;
import Java.util.Collections;
import Java.util.Comparator;

class SoftDrink {
    String name;
    String color;
    int volume; 

    SoftDrink (String name, String color, int volume) {
        this.name = name;
        this.color = color;
        this.volume = volume;
    }
}

public class ListItemComparision {
    public static void main (String...arg) {
        List<SoftDrink> softDrinkList = new ArrayList<SoftDrink>() ;
        softDrinkList .add(new SoftDrink("Faygo", "ColorOne", 4));
        softDrinkList .add(new SoftDrink("Fanta",  "ColorTwo", 3));
        softDrinkList .add(new SoftDrink("Frooti", "ColorThree", 2));       
        softDrinkList .add(new SoftDrink("Freshie", "ColorFour", 1));

        Collections.sort(softDrinkList, new Comparator() {
            @Override
            public int compare(Object softDrinkOne, Object softDrinkTwo) {
                //use instanceof to verify the references are indeed of the type in question
                return ((SoftDrink)softDrinkOne).name
                        .compareTo(((SoftDrink)softDrinkTwo).name);
            }
        }); 
        for (SoftDrink sd : softDrinkList) {
            System.out.println(sd.name + " - " + sd.color + " - " + sd.volume);
        }
        Collections.sort(softDrinkList, new Comparator() {
            @Override
            public int compare(Object softDrinkOne, Object softDrinkTwo) {
                //comparision for primitive int uses compareTo of the wrapper Integer
                return(new Integer(((SoftDrink)softDrinkOne).volume))
                        .compareTo(((SoftDrink)softDrinkTwo).volume);
            }
        });

        for (SoftDrink sd : softDrinkList) {
            System.out.println(sd.volume + " - " + sd.color + " - " + sd.name);
        }   
    }
}
23
Tirath

Collections.sortには2つの引数を使用してください。 Java.text.Collator.getInstanceを通じて取得できるような、大文字と小文字の区別を適切に処理する(つまり、UTF16の順序ではなく、字句を処理する)適切なComparatorが必要になります。

アクセント記号のない英語のみで文字列をソートしているのでなければ、おそらくCollatorを使いたいでしょう。発音区別符号は正しくソートされ、大文字小文字の区別やその他の言語固有のものは無視できます。

Collections.sort(countries, Collator.getInstance(new Locale(languageCode)));

あなたは 照合強度 を設定することができます、Javadocを見てください。

これがスロバキアの例です。

List<String> countries = Arrays.asList("Slovensko", "Švédsko", "Turecko");

Collections.sort(countries);
System.out.println(countries); // outputs [Slovensko, Turecko, Švédsko]

Collections.sort(countries, Collator.getInstance(new Locale("sk")));
System.out.println(countries); // outputs [Slovensko, Švédsko, Turecko]
7
Oliv

これがあなたが探しているものです

listOfCountryNames.sort(String::compareToIgnoreCase)
5
prashant

一行で、Java 8を使用して:

list.sort(Comparator.naturalOrder());
4
Victor Petit

Collections.sort()を使うことで、リストをソートすることができます。

public class EmployeeList {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        List<String> empNames= new ArrayList<String>();

        empNames.add("sudheer");
        empNames.add("kumar");
        empNames.add("surendra");
        empNames.add("kb");

        if(!empNames.isEmpty()){

            for(String emp:empNames){

                System.out.println(emp);
            }

            Collections.sort(empNames);

            System.out.println(empNames);
        }
    }
}

出力:

sudheer
kumar
surendra
kb
[kb, kumar, sudheer, surendra]
4
ASR

降順のアルファベット

List<String> list;
...
Collections.sort(list);
Collections.reverse(list);
2
norbDEV
//Here is sorted List alphabetically with syncronized
package com.mnas.technology.automation.utility;
import Java.util.ArrayList;
import Java.util.Collections;
import Java.util.Comparator;
import Java.util.Iterator;
import Java.util.List;

import org.Apache.log4j.Logger;
/**
* 
* @author manoj.kumar
*/
public class SynchronizedArrayList {
static Logger log = Logger.getLogger(SynchronizedArrayList.class.getName());
@SuppressWarnings("unchecked")
public static void main(String[] args) {

List<Employee> synchronizedList = Collections.synchronizedList(new ArrayList<Employee>());
synchronizedList.add(new Employee("Aditya"));
synchronizedList.add(new Employee("Siddharth"));
synchronizedList.add(new Employee("Manoj"));
Collections.sort(synchronizedList, new Comparator() {
public int compare(Object synchronizedListOne, Object synchronizedListTwo) {
//use instanceof to verify the references are indeed of the type in question
return ((Employee)synchronizedListOne).name
.compareTo(((Employee)synchronizedListTwo).name);
}
}); 
/*for( Employee sd : synchronizedList) {
log.info("Sorted Synchronized Array List..."+sd.name);
}*/

// when iterating over a synchronized list, we need to synchronize access to the synchronized list
synchronized (synchronizedList) {
Iterator<Employee> iterator = synchronizedList.iterator();
while (iterator.hasNext()) {
log.info("Sorted Synchronized Array List Items: " + iterator.next().name);
}
}

}
}
class Employee {
String name;
Employee (String name) {
this.name = name;

}
}
0
user4423251

Java 8と同じ: -

//Assecnding order
        listOfCountryNames.stream().sorted().forEach((x) -> System.out.println(x));

//Decending order
        listOfCountryNames.stream().sorted((o1, o2) -> o2.compareTo(o1)).forEach((x) -> System.out.println(x));
0
Vijay Gupta