JavaによるArrayListカスタムソートの2つの実装方法
6951 ワード
この例では,JavaによるArrayListカスタムソートの2つの実装方法について述べる.皆さんの参考にしてください.具体的には以下の通りです.
Javaでlistのカスタムソートを実現するには、主に2つの方法があります.
1)並べ替えが必要なオブジェクトのクラスにComparableインタフェースを実装させ,comparareTo(T o)メソッドを書き換え,並べ替えルールを定義するとCollections.sort()を直接呼び出してオブジェクト配列を並べ替えることができる.
テストクラス:
結果:
2)コンパレータインタフェースComparatorを実現し,comparareメソッドを書き換え,直接パラメータとしてsortに伝達する
テストクラス:
出力結果:
上の例からソートが安定していることがわかります.javaの
PS:ここでは、ソートに関するプレゼンテーションツールをお勧めします.参考にしてください.
挿入/選択/バブル/マージ/ヒル/クイックソートアルゴリズムプロセスツールをオンラインアニメーションで実証します.http://tools.jb51.net/aideddesign/paixu_ys
Javaアルゴリズムに関する詳細に興味のある方は、「Javaデータ構造とアルゴリズムチュートリアル」、「Java操作DOMノードテクニックまとめ」、「Javaファイルとディレクトリ操作テクニックまとめ」、「Javaキャッシュ操作テクニックまとめ」のトピックを参照してください.
本文で述べたjavaプログラム設計に役立つことを願っています.
Javaでlistのカスタムソートを実現するには、主に2つの方法があります.
1)並べ替えが必要なオブジェクトのクラスにComparableインタフェースを実装させ,comparareTo(T o)メソッドを書き換え,並べ替えルールを定義するとCollections.sort()を直接呼び出してオブジェクト配列を並べ替えることができる.
public class Student implements Comparable{
private int id;
private int age;
private int height;
private String name;
public Student(int id, String name, int age, int height) {
this.id = id;
this.name = name;
this.age = age;
this.height = height;
}
public int getId() {
return id;
}
public int getAge() {
return age;
}
public int getHeight() {
return height;
}
public String getName() {
return name;
}
public void setId(int id) {
this.id = id;
}
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void setHeight(int height) {
this.height = height;
}
@Override
public int compareTo(Object o) {
Student s = (Student) o;
if (this.age > s.age) {
return 1;
}
else if (this.age < s.age) {
return -1;
}
else {
if (this.height >= s.height) {
return 1;
}
else {
return -1;
}
}
}
}
テストクラス:
import java.util.*;
public class Test {
public static void printData(List list) {
for (Student student : list) {
System.out.println(" :" + student.getId() + " :" + student.getName() + " " + student.getAge() + " :" + student.getHeight());
}
}
public static void main(String[] args) {
List list = new ArrayList<>();
list.add(new Student(1, "A", 20, 180));
list.add(new Student(2, "B", 21, 175));
list.add(new Student(3, "C", 22, 190));
list.add(new Student(4, "D", 21, 170));
list.add(new Student(5, "E", 20, 185));
System.out.println("before sorted");
printData(list);
Collections.sort(list);
System.out.println("after age and height sorted");
printData(list);
}
}
結果:
before sorted
:1 :A 20 :180
:2 :B 21 :175
:3 :C 22 :190
:4 :D 21 :170
:5 :E 20 :185
after age and height sorted
:1 :A 20 :180
:5 :E 20 :185
:4 :D 21 :170
:2 :B 21 :175
:3 :C 22 :190
2)コンパレータインタフェースComparatorを実現し,comparareメソッドを書き換え,直接パラメータとしてsortに伝達する
public class Student {
private int id;
private int age;
private int height;
private String name;
public Student(int id, String name, int age, int height) {
this.id = id;
this.name = name;
this.age = age;
this.height = height;
}
public int getId() {
return id;
}
public int getAge() {
return age;
}
public int getHeight() {
return height;
}
public String getName() {
return name;
}
public void setId(int id) {
this.id = id;
}
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void setHeight(int height) {
this.height = height;
}
}
テストクラス:
import java.util.*;
public class Test {
public static void printData(List list) {
for (Student student : list) {
System.out.println(" :" + student.getId() + " :" + student.getName() + " " + student.getAge() + " :" + student.getHeight());
}
}
public static void main(String[] args) {
List list = new ArrayList<>();
list.add(new Student(1, "A", 20, 180));
list.add(new Student(2, "B", 21, 175));
list.add(new Student(3, "C", 22, 190));
list.add(new Student(4, "D", 21, 170));
list.add(new Student(5, "E", 20, 185));
System.out.println("before sorted");
printData(list);
Collections.sort(list, new Comparator() {
@Override
public int compare(Student o1, Student o2) {
if(o1.getAge() >= o2.getAge()) {
return 1;
}
else {
return -1;
}
}
});
System.out.println("after age sorted");
printData(list);
Collections.sort(list, new Comparator() {
@Override
public int compare(Student o1, Student o2) {
if(o1.getAge() > o2.getAge()) {
return 1;
}
else if (o1.getAge() < o2.getAge()){
return -1;
}
else {
if (o1.getHeight() >= o2.getHeight()) {
return 1;
}
else {
return -1;
}
}
}
});
System.out.println("after age and height sorted");
printData(list);
}
}
出力結果:
before sorted
:1 :A 20 :180
:2 :B 21 :175
:3 :C 22 :190
:4 :D 21 :170
:5 :E 20 :185
after age sorted
:1 :A 20 :180
:5 :E 20 :185
:2 :B 21 :175
:4 :D 21 :170
:3 :C 22 :190
after age and height sorted
:1 :A 20 :180
:5 :E 20 :185
:4 :D 21 :170
:2 :B 21 :175
:3 :C 22 :190
上の例からソートが安定していることがわかります.javaの
Collections.sort
のソースコードを見てみると、確かに安定した集計ソートに基づいて実現されています.内部ではTimSortという最適化も行われています.(TimSortについても参照https://baike.baidu.com/item/TimSort?fr=aladdin) PS:ここでは、ソートに関するプレゼンテーションツールをお勧めします.参考にしてください.
挿入/選択/バブル/マージ/ヒル/クイックソートアルゴリズムプロセスツールをオンラインアニメーションで実証します.http://tools.jb51.net/aideddesign/paixu_ys
Javaアルゴリズムに関する詳細に興味のある方は、「Javaデータ構造とアルゴリズムチュートリアル」、「Java操作DOMノードテクニックまとめ」、「Javaファイルとディレクトリ操作テクニックまとめ」、「Javaキャッシュ操作テクニックまとめ」のトピックを参照してください.
本文で述べたjavaプログラム設計に役立つことを願っています.