私はJavaで倍精度のリストを持っていると私は降順で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
Collections.sort(testList);
Collections.reverse(testList);
それはあなたが望むことをするでしょう。 Collections
をインポートするのを忘れないでください。
これはCollections
のドキュメントです。
降順:
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;
}
});
Java.util.Collections classのutilメソッドを使用します。
Collections.sort(list)
実際、あなたがカスタムオブジェクトをソートしたいなら、あなたは使うことができます
Collections.sort(List<T> list, Comparator<? super T> c)
コレクションを見るapi
あなたの例では、これは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
ラムダ(Java8)を使用し、構文の最も厳しい部分(この場合、JVMはplentyを推測します)にそれを取り除きます。
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
が推測され、中括弧は不要です。
Java 8では、Listインターフェースにはデフォルトのsortメソッドがあり、これによりComparatorを提供している場合にコレクションをソートすることができます。次のように質問の例を簡単に並べ替えることができます。
testList.sort((a, b) -> Double.compare(b, a));
注:Double.compareに渡されると、ソートが確実に降順になるように、ラムダの引数が入れ替わります。
list
にlist
要素が含まれる場合は、Collections.sort(list)
を使用してComparable
をソートできます。そうでなければ、私はあなたにここでそのようなインターフェースを実装することを勧めます:
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)
を使用することもできます。順番はcompareTo
メソッドに依存します。詳しくは https://docs.Oracle.com/javase/tutorial/collections/interfaces/order.html をご覧ください。
Collections.sort
を使うと、ソートロジックを定義するComparator
のインスタンスを渡すことができます。そのため、リストを自然な順序でソートしてから元に戻すのではなく、リストを逆の順序でソートするために単にCollections.reverseOrder()
をsort
に渡すことができます。
// import Java.util.Collections;
Collections.sort(testList, Collections.reverseOrder());
@ Marco13で述べられているように、より慣用的(そしておそらくより効率的)であることを除いて、逆順比較を使用することはソートが安定していることを確実にします逆にすると順番が変わります)
//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;
}
}
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);
| * |リストの並べ替え
import Java.util.Collections;
| => Ascのソート順:
Collections.sort(NamAryVar);
| => Dscの並べ替え順:
Collections.sort(NamAryVar, Collections.reverseOrder());
| * |リストの順序を逆にする:
Collections.reverse(NamAryVar);
あなたはこのようにすることができます:
List<String> yourList = new ArrayList<String>();
Collections.sort(yourList, Collections.reverseOrder());
CollectionにはデフォルトのComparatorがあります。
また、Java 8の新機能を使いたい場合は、次のようにします。
List<String> yourList = new ArrayList<String>();
yourList = yourList.stream().sorted(Collections.reverseOrder()).collect(Collectors.toList());
あなたはそのように使うことができます
ArrayList<Group> groupList = new ArrayList<>();
Collections.sort(groupList, Collections.reverseOrder());
Collections.reverse(groupList);
例えば、私はPersonというクラスを持っています:String name、int age ==>コンストラクタ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]]
}
次の行は太くするべきです
testList.sort(Collections.reverseOrder());
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())
Eclipse Collections を使うと、プリミティブな二重リストを作成し、それをソートしてから逆順にすることができます。このアプローチは、ダブルスボクシングを回避するでしょう。
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 Collections のコミッターです。
これは典型的なケースをカバーする短いチートシートです:
// 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))