リストをアルファベット順に並べ替える方法を教えてください。


回答:


218

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

 java.util.Collections.sort(listOfCountryNames)

「UK」のような国名がある場合、それは壊れます。
トム・ホーティン-09

1
この場合、追加の引数としてコンパレータを渡すことができます。ただし、そのコンパレータを実装することは興味深い部分です。
ティロ

7
コンパレータ=使用java.text.Collat​​or.getInstance Implemeting
ティロ

143

Collections.sortによるソリューション

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

  • リストを作成
  • 国名をいくつか追加してください
  • それらを一度分類する
  • そのリストを二度と変更しない

その後、ティロスの答えはそれを行うための最良の方法になります。Tom Hawtin-タックラインのアドバイスと組み合わせると、次のようになります。

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すぐに知っています。これは、重複のないソートされた文字列のコレクションであり、これはいつでも正しいと確信できます。短い宣言で非常に多くの情報。
  • 場合によっては、実際のパフォーマンスが向上します。リストを使用し、値を非常に頻繁に挿入し、それらの挿入の間にリストが読み取られる可能性がある場合、挿入ごとにリストをソートする必要があります。このセットは同じことを行いますが、はるかに高速です。

適切なタスクに適切なコレクションを使用することは、短くてバグのないコードを書くための鍵です。この場合、1行だけを保存するので、これは実証的ではありません。しかし、重複がないことを確認し、その機能を自分で構築したいときに、リストを使用している人をどれだけ頻繁に見るかを数えるのをやめました。さらに悪いことに、本当にマップが必要なときに2つのリストを使用することもできます。

誤解しないでください。Collections.sortの使用はエラーでも欠陥でもありません。ただし、TreeSetの方がずっとクリーンな場合が多くあります。


並べ替えよりもTreeSetを使用する利点はないと思います。
DJClayworth 2009

1
まあTreeSetは偶然の重複(良いか悪いかもしれません)を避け、それはより速いはずです(ただし、入力のサイズが与えられてもそれほど多くはありません)。すべての入力の後でソートされるのではなく常にソートされます(各リストの後にリストをソートしない限り)挿入)これは重要かもしれませんが、おそらく問題ではありません。とても速い..
TofuBeer 2009

1
@TofuBeerあなたがやっている間も、私はこれを明らかにしていました。そして、何がより速いかを本当に気にしているのであれば、stackoverflow.com / questions / 168891
Lena Schimmel

7
項目が変更可能な場合、TreeSetはソートされたままにはなりません。
Joshua Goldberg、

3
@JoshuaGoldbergソートされないだけでなく、正しく機能しなくなると思います。少なくともオブジェクトの変異がソート順に影響を与える場合。ツリーセットは、そのタスク(検索、削除、挿入など)を実行するためにソートされているアイテムに依存しています。
Lena Schimmel、2011

29

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

別のオプションは、コレクションAPIを介してインプレースでソートすることです。

Collections.sort(names);

28

遅刻しない方がいいです!これが私たちがそれを行う方法です(学習目的のみ)-

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

4
繰り返しになりますが、1行で十分な場合は、このすべてのコードを正当化する必要はありません。レナの答えを見てください。
james.garriss 2015

1
これは演習として機能する可能性がありますが、実稼働コードでそれを見た場合、私はそれを恐れます。すぐに。
カッツェンハット2015

2
@ james.garriss、Lenaの答えは、文字列の単純なリストに対するものでした。これは、ソートされる文字列属性を含むオブジェクトのリストに対するものです。
Muneeb Mirza

ええ、この回答はオブジェクトを使って本番環境で作業するときに非常に役立ちます。文字列のリストはそれほど一般的ではありません。
ドミニクK


9

ofの2つの引数を使用しますCollections.sort。をComparator介して取得できるような、大文字小文字を適切に処理する(つまり、UTF16順序ではなく字句を処理する)適切なものが必要になりjava.text.Collator.getInstanceます。


9

アクセントなしの英語のみで文字列を並べ替えるのでない限り、おそらくを使用したいと思うでしょうCollator。これは発音区別符号を正しくソートし、大文字小文字やその他の言語固有のものを無視できます。

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

照合強度を設定できます。javadocを参照してください。

ここではスロバキアのための一例であるŠ後に行く必要がありますSが、UTFでŠ後にどこかにありますZ

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

ここにあなたが探しているものがあります

listOfCountryNames.sort(String::compareToIgnoreCase)

1
Éなどの言語では機能しません...アクセントを削除する必要があります
Vincent D.

5

を使用する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

降順のアルファベット:

List<String> list;
...
Collections.sort(list);
Collections.reverse(list);

これは私が探していたものです。最初にリストをAZに、次に比較のためにZAに並べ替える必要があります。いい答えだ。
japesソフィー

1

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
//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;

}
}

しかし、なぜ?Lenaの回答で1行のコードよりもこれらの50行のコードを使用する方が良いのはなぜですか?
james.garriss 2015

なぜなら、sort(List <T>、Comparator <?super T>)メソッドは、指定されたコンパレーターによって引き起こされた順序に従って、指定されたリストをソートするために使用されるからです。Emplpyeeのリストを名前と年齢でソートする場合は、メソッドCollections

いいえ、申し訳ありませんが、ここでは愛を感じていません。別の質問、つまり、オブジェクトのリストをプロパティでソートする方法に答えています。あなたのコードはその目的のために役立つかもしれませんが、OPの質問にとってはやり過ぎです。:-(
james.garriss 2015

-12

私が作った方法を使ってみてください。

String key-希望する順序になります。この場合はアルファベット順になります。「abc ...」と入力するだけです。

String list[] -キーを使って並べたいリスト。

int index -0に設定すると、キーのオフセットが設定されます。

    public static String[] order(String key, String list[], int index) {
    ArrayList<String> order_List = new ArrayList<String>();
    ArrayList<String> temp_Order_List = null;
    char[] key_char = key.toCharArray();
    for (int offset = 0; offset < key_char.length; offset++) {
        if (key_char.length >= offset + index) {
            String str = (index > 1 ? list[0].substring(0, index - 1) : "")
                    + new String(key_char, offset, 1);
            for (int i = 0; i < list.length; i++) {
                temp_Order_List = new ArrayList<String>();
                for (int k = 0; k < list.length; k++) {
                    if (!order_List.contains(list[k])
                            && !temp_Order_List.contains(list[k])) {
                        if (list[k].equalsIgnoreCase(str))
                            order_List.add(list[k]);
                        else if (list[k].toLowerCase().startsWith(str.toLowerCase())) {
                            temp_Order_List.add(list[k]);

                        }
                    }
                }
                if (temp_Order_List.size() > 0) {
                    if (temp_Order_List.size() > 1) {
                        String[] add = order(key,
                                temp_Order_List.toArray(new String[temp_Order_List
                                        .size()]), index + 1);
                        for (String s : add) {
                            order_List.add(s);
                        }
                    } else {
                        order_List.add(temp_Order_List.get(0));
                    }
                }
            }
        }
    }
    return order_List.toArray(new String[order_List.size()]);
}

32
もちろん、30行のコードを記述できる場合にjava.util.Collections.sort(list)を使用する理由:)
Jirka

1
なぜそれほど多くの反対票がここにあるのですか?誰かがこのコードを実行しようとしたり、使用されているアルゴリズムを理解しようとしたりしていますか?
JBoy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.