ArrayListをソートする方法は?


352

Javaのdoubleのリストがあり、ArrayListを降順に並べ替えたい。

入力ArrayListは次のとおりです。

List<Double> testList = new ArrayList();

testList.add(0.5);
testList.add(0.2);
testList.add(0.9);
testList.add(0.1);
testList.add(0.1);
testList.add(0.1);
testList.add(0.54);
testList.add(0.71);
testList.add(0.71);
testList.add(0.71);
testList.add(0.92);
testList.add(0.12);
testList.add(0.65);
testList.add(0.34);
testList.add(0.62);

アウトプットはこんな感じ

0.92
0.9
0.71
0.71
0.71
0.65
0.62
0.54
0.5
0.34
0.2
0.12
0.1
0.1
0.1

回答:


524
Collections.sort(testList);
Collections.reverse(testList);

それはあなたが望むことをします。インポートすることを忘れないでくださいCollections

これはのドキュメントですCollections


53
多分それはあなたがあなた自身のものを定義できることを言及する価値がありますComparator:)
Polygnome '27

1
@Polygnome OPはソートのみDoubleです。
tckmn 2013

3
はい。ただし、ユースケースに応じて、さまざまな方法で並べ替えることができます。時には、それらを0までの距離で並べ替えることができます。私はのランタイム特性についてさえ知りませんがreverse、降順で並べ替える方が実際には昇順で並べ替えてから逆順にする方が速い場合があります。さらに、Comparatorコンストラクタ引数としてサポートするList実装を使用すると(したがって、それを不変に保ちます)、リストが常にソートされるようになります。
Polygnome 2013

4
@Ayeshaはい、裏でCollections.sort使用compareToします。
tckmn 2014年

45
実際に使用する必要がありますCollections.sort(list, Collections.reverseOrder());。より慣用的である(そしてより効率的である)こととは別に、逆順コンパレーターを使用すると、ソートが安定していることを確認できます(つまり、コンパレーターに従って要素が等しい場合、要素の順序は変更されませんが、逆にすると、順序が変わります)。
Marco13 2014

134

降順:

Collections.sort(mArrayList, new Comparator<CustomData>() {
    @Override
    public int compare(CustomData lhs, CustomData rhs) {
        // -1 - less than, 1 - greater than, 0 - equal, all inversed for descending
        return lhs.customInt > rhs.customInt ? -1 : (lhs.customInt < rhs.customInt) ? 1 : 0;
    }
});

1
どちらがあり、ソートしたい場合CustomData はどうすればよいですか?クラスでモデルにアクセスするだけです。List<AnotherModel>AnotherModelididCustomData
Dr.jacky

2
CustomDataクラスをAnotherModelに置き換えて、次のような行を作成します。return lhs.id> rhs.id?-1:..など
-user2808054

Integer.compare(rhs.customInt, lhs.customInt);
COMPARE RETURN

92

utilメソッドを使用する java.util.Collectionsクラスの

Collections.sort(list)

実際、カスタムオブジェクトを並べ替える場合は、

Collections.sort(List<T> list, Comparator<? super T> c) 

コレクションAPIを見る


90

あなたの例では、これはJava 8で魔法をかけるでしょう

List<Double> testList = new ArrayList();
testList.sort(Comparator.naturalOrder());

ただし、並べ替えるオブジェクトの一部のフィールドで並べ替える場合は、次の方法で簡単に行うことができます。

testList.sort(Comparator.comparing(ClassName::getFieldName));

または

 testList.sort(Comparator.comparing(ClassName::getFieldName).reversed());

または

 testList.stream().sorted(Comparator.comparing(ClassName::getFieldName).reversed()).collect(Collectors.toList());

ソース:https : //docs.oracle.com/javase/8/docs/api/java/util/Comparator.html


「比較」方法はどこにありますか?
lippo 2016年

1
インポートする必要があります:import static java.util.Comparator.comparing;
krmanish007 2016年

1
Java 1.7で利用可能ですか?
lippo 2016年

5
いいえ、これはストリームおよび機能インターフェースの一部であり、すべてJava 8の一部です
krmanish007

1
あなたは正しい@AjahnCharlesです。彼らはゼロ引数を削除したので、私は今私の答えを更新しました。
krmanish007 2018年

54

ラムダ(Java8)を使用し、それを最小限の構文にまで削減します(この場合、JVMは多くのことを推測します)。

Collections.sort(testList, (a, b) -> b.compareTo(a));

より詳細なバージョン:

// Implement a reverse-order Comparator by lambda function
Comparator<Double> comp = (Double a, Double b) -> {
    return b.compareTo(a);
};

Collections.sort(testList, comp);

Comparatorインターフェースには実装するメソッドが1つしかないため、ラムダを使用できるため、VMはどのメソッドが実装されているかを推測できます。paramsのタイプは推論できるため、それらを指定する必要はありません(つまりの(a, b)代わりに(Double a, Double b)。ラムダ本体には1行しかなく、メソッドが値を返すことが期待されているため、returnは推論され、中括弧が必要ありません。


これはかっこいい、ありがとう!これはもう少しコンパクトです:Collections.sort(testList、Comparator.reverseOrder());
kavics

さらにコンパクト:testList.sort(Comparator.reverseOrder());
jonasespelita

29

Java8では、リストインターフェースにデフォルトのソートメソッドがあり、コンパレータを提供する場合にコレクションをソートできます。次のように、質問の例を簡単に並べ替えることができます。

testList.sort((a, b) -> Double.compare(b, a));

注:ラムダ内の引数は、Double.compareに渡されるときに入れ替えられ、ソートが確実に降順になります。


これはオブジェクトを使用した並べ替えにも機能するため、私にとってこれが最良の答えです...例 locationDetails.sort((locationDetailAsc,locationDetailsDsc) -> Long.compare(locationDetailsDsc.getSnapshot().getQuantity(), locationDetailAsc.getSnapshot().getQuantity()));
Anas

26

要素が含まれている場合は、を使用Collections.sort(list)してソートlistできます。それ以外の場合は、次のようにそのインターフェースを実装することをお勧めします。listComparable

public class Circle implements Comparable<Circle> {}

そしてもちろん、compareToこのようなメソッドの独自の実現を提供します:

@Override
    public int compareTo(Circle another) {
        if (this.getD()<another.getD()){
            return -1;
        }else{
            return 1;
        }
    }

そして、Colection.sort(list)今度はリストにComparableタイプのオブジェクトが含まれ、ソートできるので、再び使用できます。順序はcompareToメソッドによって異なります。詳細については、https://docs.oracle.com/javase/tutorial/collections/interfaces/order.htmlを確認してください


11

Collections.sortComparator並べ替えロジックを定義するのインスタンスを渡すことができます。代わりに自然な順序でリストをソートし、それを逆転させるので、一つは単純に渡すことができますCollections.reverseOrder()sort逆の順序でリストをソートするために:

// import java.util.Collections;
Collections.sort(testList, Collections.reverseOrder());

@ Marco13で述べたように、より慣用的(そしておそらくより効率的)であることを除いて、逆順コンパレーターを使用すると、ソートが安定していることを確認できます(つまり、要素がコンパレーターに従って等しい場合、要素の順序は変更されません)。一方、逆転すると順序が変わります)


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

    }
}

Collections.synchronizedListが私たちを助けてくれているようです
vitalinvent

7

以下は典型的なケースをカバーする短いチートシートです:

// sort
list.sort(naturalOrder())

// sort (reversed)
list.sort(reverseOrder())

// sort by field
list.sort(comparing(Type::getField))

// sort by field (reversed)
list.sort(comparing(Type::getField).reversed())

// sort by int field
list.sort(comparingInt(Type::getIntField))

// sort by double field (reversed)
list.sort(comparingDouble(Type::getDoubleField).reversed())

// sort by nullable field (nulls last)
list.sort(comparing(Type::getNullableField, nullsLast(naturalOrder())))

// two-level sort
list.sort(comparing(Type::getField1).thenComparing(Type::getField2))

5

Java SE 8を使用している場合は、これが役立つ場合があります。

//create a comparator object using a Lambda expression
Comparator<Double> compareDouble = (d1, d2) -> d1.compareTo(d2);

//Sort the Collection in this case 'testList' in reverse order
Collections.sort(testList, Collections.reverseOrder(compareDouble));

//print the sorted list using method reference only applicable in SE 8
testList.forEach(System.out::println);

6
Collections.reverseOrder()引数もないため、実装が不要になりますcompareDoubleDoublesの自然な順序付けと同じです)。ここでの答えは次のとおりですCollections.sort(testList, Collections.reverseOrder());
Matt

5

| * | リストの並べ替え:

import java.util.Collections;

| =>昇順で並べ替え:

Collections.sort(NamAryVar);

| => DSC順序で並べ替え:

Collections.sort(NamAryVar, Collections.reverseOrder());

| * | リストの順序を逆にします:

Collections.reverse(NamAryVar);

4

あなたはこのようにすることができます:

List<String> yourList = new ArrayList<String>();
Collections.sort(yourList, Collections.reverseOrder());

コレクションには、それを支援するデフォルトのコンパレータがあります。

また、Java 8の新機能を使用したい場合は、次のようにすることができます。

List<String> yourList = new ArrayList<String>();
yourList = yourList.stream().sorted(Collections.reverseOrder()).collect(Collectors.toList());

3

たとえば、クラスPerson:String name、int age ==> Constructor new Person(name、age)があります。

import java.util.Collections;
import java.util.ArrayList;
import java.util.Arrays;


public void main(String[] args){
    Person ibrahima=new Person("Timera",40);
    Person toto=new Person("Toto",35);
    Person alex=new Person("Alex",50);
    ArrayList<Person> myList=new ArrayList<Person>
    Collections.sort(myList, new Comparator<Person>() {
        @Override
        public int compare(Person p1, Person p2) {
            // return p1.age+"".compareTo(p2.age+""); //sort by age
            return p1.name.compareTo(p2.name); // if you want to short by name
        }
    });
    System.out.println(myList.toString());
    //[Person [name=Alex, age=50], Person [name=Timera, age=40], Person [name=Toto, age=35]]
    Collections.reverse(myList);
    System.out.println(myList.toString());
    //[Person [name=Toto, age=35], Person [name=Timera, age=40], Person [name=Alex, age=50]]

}

if you want to short by name->if you want to sort by name
リンロンビン

3

JAVA 8では、とても簡単になりました。

List<String> alphaNumbers = Arrays.asList("one", "two", "three", "four");
List<String> alphaNumbersUpperCase = alphaNumbers.stream()
    .map(String::toUpperCase)
    .sorted()
    .collect(Collectors.toList());
System.out.println(alphaNumbersUpperCase); // [FOUR, ONE, THREE, TWO]

-これを逆に使用するには

.sorted(Comparator.reverseOrder())

3

そんな風に使えます

ArrayList<Group> groupList = new ArrayList<>();
Collections.sort(groupList, Collections.reverseOrder());
Collections.reverse(groupList);

1

ではEclipseのコレクションあなたは、原始的な二重のリストを作成し、それを並べ替えた後、降順にそれを置くためにそれを逆転できます。このアプローチは、ダブルスのボックス化を回避します。

MutableDoubleList doubleList =
    DoubleLists.mutable.with(
        0.5, 0.2, 0.9, 0.1, 0.1, 0.1, 0.54, 0.71,
        0.71, 0.71, 0.92, 0.12, 0.65, 0.34, 0.62)
        .sortThis().reverseThis();
doubleList.each(System.out::println);

が必要なList<Double>場合は、次のように機能します。

List<Double> objectList =
    Lists.mutable.with(
        0.5, 0.2, 0.9, 0.1, 0.1, 0.1, 0.54, 0.71,
        0.71, 0.71, 0.92, 0.12, 0.65, 0.34, 0.62)
        .sortThis(Collections.reverseOrder());
objectList.forEach(System.out::println);

タイプをのままにしたい場合は、次のようにユーティリティクラスArrayList<Double>を使用してリストを初期化およびソートできArrayListIterateます。

ArrayList<Double> arrayList =
    ArrayListIterate.sortThis(
            new ArrayList<>(objectList), Collections.reverseOrder());
arrayList.forEach(System.out::println);

注:私はEclipseコレクションのコミッターです。


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