Collectionsのsortメソッドのソート
8453 ワード
CollectionのsortメソッドでListをソートするには、次の2つの方法があります.
1.List内のオブジェクトはComparableインタフェースを継承し、そのcompareToメソッドを実装する
//比較対象クラスPersonH
[java] view plain copy print ?
public class PersonH implements Comparable {
private int level;
public Integer getLevel() {
return level; }
public void setLevel(Integer level1) {
this.level = level1; }
@Override public int compareTo(PersonH o)
{ // TODO Auto-generated method stub
return this.getLevel().compareTo(o.getLevel()); }
}
//Mainクラステスト
[java] view plain copy print ?
public class Main {
/**
* @param args */
public static void main(String[] args) {
// TODO Auto-generated method stub PersonH person = new PersonH();
person.setLevel(6); PersonH person2 = new PersonH();
person2.setLevel(8); PersonH person3 = new PersonH();
person3.setLevel(3); ArrayList personList = new ArrayList();
personList.add(person);
personList.add(person2); personList.add(person3);
Collections.sort(personList);//ソート
for(PersonH personH : personList) //ソート結果の出力 {
System.out.println(personH.getLevel()); }
}
}
2.Collection.sortリロードにより、//P e rsonHクラスを実現
[java] view plain copy print ?
public class PersonH {
private int level;
public Integer getLevel() {
return level; }
public void setLevel(Integer level1) {
this.level = level1; }
}
//Mainクラス
[java] view plain copy print ?
public class Main {
/**
* @param args */
public static void main(String[] args) {
// TODO Auto-generated method stub PersonH person = new PersonH();
person.setLevel(6); PersonH person2 = new PersonH();
person2.setLevel(8); PersonH person3 = new PersonH();
person3.setLevel(3); ArrayList personList = new ArrayList();
personList.add(person);
personList.add(person2); personList.add(person3);
//ここで、比較ポリシーをより柔軟に指定することができ、第1の実装方法は、比較対象のクラスに比較ポリシーを固定することである. Collections.sort(personList,new Comparator()
{ public int compare(PersonH p1,PersonH p2)
{ return p1.getLevel().compareTo(p2.getLevel());
} });
for(PersonH personH : personList) {
System.out.println(personH.getLevel()); }
}
}
次に、この方法がどのようにソートされているかを見てみましょう.
1つ目の場合:
[java] view plain copy print ?
public static extends Comparable super T>> void sort(List list) { Object[] a = list.toArray();
Arrays.sort(a); ListIterator i = list.listIterator();
for (int j=0; j i.next();
i.set((T)a[j]); }
}
[java] view plain copy print ?
public static void sort(Object[] a) { Object[] aux = (Object[])a.clone();
mergeSort(aux, a, 0, a.length, 0); }
2つ目の場合:
[java] view plain copy print ?
public static void sort(List list, Comparator super T> c) { Object[] a = list.toArray();
Arrays.sort(a, (Comparator)c); ListIterator i = list.listIterator();
for (int j=0; j i.next();
i.set(a[j]); }
}
[java] view plain copy print ?
public static void sort(T[] a, Comparator super T> c) { T[] aux = (T[])a.clone();
if (c==null) mergeSort(aux, a, 0, a.length, 0);
else mergeSort(aux, a, 0, a.length, 0, c);
}
まず、ソートポリシーを指定するかどうかを見てみましょう.そうでなければ、比較ポリシーの集計ソートを指定します.
mergeSort関数のソースコードはjava.util.Arraysクラスを参照できます.
1.List内のオブジェクトはComparableインタフェースを継承し、そのcompareToメソッドを実装する
//比較対象クラスPersonH
[java] view plain copy print ?
public class PersonH implements Comparable
private int level;
public Integer getLevel()
return level;
public void setLevel(Integer level1)
this.level = level1;
@Override
{
return this.getLevel().compareTo(o.getLevel());
}
public class PersonH implements Comparable
{
private int level;
public Integer getLevel()
{
return level;
}
public void setLevel(Integer level1)
{
this.level = level1;
}
@Override
public int compareTo(PersonH o)
{
// TODO Auto-generated method stub
return this.getLevel().compareTo(o.getLevel());
}
}
//Mainクラステスト
[java] view plain copy print ?
public class Main
* @param args
public static void main(String[] args)
// TODO Auto-generated method stub
person.setLevel(6);
person2.setLevel(8);
person3.setLevel(3);
personList.add(person2);
for(PersonH personH : personList) //ソート結果の出力
System.out.println(personH.getLevel());
}
}
public class Main
{
/**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
PersonH person = new PersonH();
person.setLevel(6);
PersonH person2 = new PersonH();
person2.setLevel(8);
PersonH person3 = new PersonH();
person3.setLevel(3);
ArrayList personList = new ArrayList();
personList.add(person);
personList.add(person2);
personList.add(person3);
Collections.sort(personList);//
for(PersonH personH : personList) //
{
System.out.println(personH.getLevel());
}
}
}
これはクラスpersonHが指定した基本ソートポリシーを備えていることに相当し、compareToメソッドを実現しているためである.2.Collection.sortリロードにより、//P e rsonHクラスを実現
[java] view plain copy print ?
public class PersonH
private int level;
public Integer getLevel()
return level;
public void setLevel(Integer level1)
this.level = level1;
}
public class PersonH
{
private int level;
public Integer getLevel()
{
return level;
}
public void setLevel(Integer level1)
{
this.level = level1;
}
}
//Mainクラス
[java] view plain copy print ?
public class Main
* @param args
public static void main(String[] args)
// TODO Auto-generated method stub
person.setLevel(6);
person2.setLevel(8);
person3.setLevel(3);
personList.add(person2);
//ここで、比較ポリシーをより柔軟に指定することができ、第1の実装方法は、比較対象のクラスに比較ポリシーを固定することである.
{
{
}
for(PersonH personH : personList)
System.out.println(personH.getLevel());
}
}
public class Main
{
/**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
PersonH person = new PersonH();
person.setLevel(6);
PersonH person2 = new PersonH();
person2.setLevel(8);
PersonH person3 = new PersonH();
person3.setLevel(3);
ArrayList personList = new ArrayList();
personList.add(person);
personList.add(person2);
personList.add(person3);
// , 。
Collections.sort(personList,new Comparator()
{
public int compare(PersonH p1,PersonH p2)
{
return p1.getLevel().compareTo(p2.getLevel());
}
});
for(PersonH personH : personList)
{
System.out.println(personH.getLevel());
}
}
}
次に、この方法がどのようにソートされているかを見てみましょう.
1つ目の場合:
[java] view plain copy print ?
public static extends Comparable super T>> void sort(List list) {
Arrays.sort(a);
for (int j=0; j
i.set((T)a[j]);
}
public static > void sort(List list) {
Object[] a = list.toArray();
Arrays.sort(a);
ListIterator i = list.listIterator();
for (int j=0; j
[java] view plain copy print ?
public static void sort(Object[] a) {
mergeSort(aux, a, 0, a.length, 0);
public static void sort(Object[] a) {
Object[] aux = (Object[])a.clone();
mergeSort(aux, a, 0, a.length, 0);
}
は、直接呼び出し集計ソートによって行われたことを示すことができる.2つ目の場合:
[java] view plain copy print ?
public static void sort(List list, Comparator super T> c) {
Arrays.sort(a, (Comparator)c);
for (int j=0; j
i.set(a[j]);
}
public static void sort(List list, Comparator super T> c) {
Object[] a = list.toArray();
Arrays.sort(a, (Comparator)c);
ListIterator i = list.listIterator();
for (int j=0; j
[java] view plain copy print ?
public static void sort(T[] a, Comparator super T> c) {
if (c==null)
else
}
public static void sort(T[] a, Comparator super T> c) {
T[] aux = (T[])a.clone();
if (c==null)
mergeSort(aux, a, 0, a.length, 0);
else
mergeSort(aux, a, 0, a.length, 0, c);
}
は、いずれもmergeSortによって実現される.まず、ソートポリシーを指定するかどうかを見てみましょう.そうでなければ、比較ポリシーの集計ソートを指定します.
mergeSort関数のソースコードはjava.util.Arraysクラスを参照できます.