Java:コレクションリスト(List)のカスタムオブジェクトを属性(フィールド)でソートする方法...
14691 ワード
1.要求
リスト(List)のカスタムオブジェクトに対しては、オブジェクトの属性(フィールド)に従ってソート(正順、逆順)が要求される.
たとえば、ユーザー・オブジェクト(Member)には、ユーザー名(username)、レベル(level)、生年月日(birthday)などのフィールドがあり、それぞれ3つのフィールドをソートする必要があります.
2.実現構想
1.カスタムオブジェクトについては、カスタムオブジェクトでComparableインタフェースを実装し、Collections.sortを呼び出す方法でソートを実装できます.1つの属性(フィールド)に対してのみ、1つの順序を維持できます.実マルチフィールドで任意のソートを選択するには、Collections.sort(List list,Comparator super T>c)メソッドを呼び出して、Comparatorに転送する必要があります.
2.上記の手順で複雑で重複するコードを避けるために、共通のソートクラスを書くことができ、カスタムオブジェクトに対して、異なる属性(フィールド)に対してソート(正順、逆順)を実現することができる.
3.実装コード
メンバークラス
MySortListクラス
出力:
[1|wm 123|3|1992-12-01,2|a 234|8|1995-12-01,3|m 456|12|1990-12-01]Memberデフォルトソート(持参したcompareTo方法で)後...[2|a 234|8|1995-12-01,3|m 456|12|1990-12-01,1|wm 123|3|1991-12-01,1|wm 123|3|1992-12-01]Member逆シーケンス(持参したcompareTo方法で)後...[1|wm 123|3|1992-12-01,3|m 456|1990-12-01,2|a 234|8|8|8|8|8|1992-01,2-01,|a 234|1995-12-01][2]a 234|8|1995-12-01,3|m 456|12|1990-12-01,1|wm 123|1993-12-01]Memberフィールドレベルでソート後...[1|wm 123|3|1992-12-01,2|a 234|8|1995-12-01,3|m 456|12-01,3|1990-12-01]Memberフィールド生年月日逆シーケンス後...[2|a 234|8|1995-12-01,1|wm 1233|1992-12-01,3|m 456|12-01,1990-12-01]
リスト(List)のカスタムオブジェクトに対しては、オブジェクトの属性(フィールド)に従ってソート(正順、逆順)が要求される.
たとえば、ユーザー・オブジェクト(Member)には、ユーザー名(username)、レベル(level)、生年月日(birthday)などのフィールドがあり、それぞれ3つのフィールドをソートする必要があります.
2.実現構想
1.カスタムオブジェクトについては、カスタムオブジェクトでComparableインタフェースを実装し、Collections.sortを呼び出す方法でソートを実装できます.1つの属性(フィールド)に対してのみ、1つの順序を維持できます.実マルチフィールドで任意のソートを選択するには、Collections.sort(List list,Comparator super T>c)メソッドを呼び出して、Comparatorに転送する必要があります.
2.上記の手順で複雑で重複するコードを避けるために、共通のソートクラスを書くことができ、カスタムオブジェクトに対して、異なる属性(フィールド)に対してソート(正順、逆順)を実現することができる.
3.実装コード
メンバークラス
package com.clzhang.sample.collections;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
*
* @author acer
*
*/
public class Member implements Comparable{
//
private static final SimpleDateFormat MY_SDF = new SimpleDateFormat(
"yyyy-MM-dd");
//
private int id;
private String username;
private int level;
private Date birthday;
//
public Member(int id, String username, int level, String birthday) throws Exception {
this.id = id;
this.username = username;
this.level = level;
this.birthday = new Date(MY_SDF.parse(birthday).getTime());
}
// Getters
public String getUsername() {
return username;
}
public int getLevel() {
return level;
}
public Date getBirthday() {
return birthday;
}
//
@Override
public String toString() {
return id + "|" + username + "|" + level + "|" + MY_SDF.format(birthday);
}
// : MySortList , 。 Collections.sort 。
@Override
public int compareTo(Member m) {
// , 。
return this.getUsername().compareTo(m.getUsername());
}
}
MySortListクラス
package com.clzhang.sample.collections;
import java.util.*;
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;
/**
* , (List) ; 。
* (String)、 (Date)、 (Integer) 。
* @author acer
*
* @param
*/
public class MySortList {
/**
* 。 、 、 。
* @param list
* @param method
* @param reverseFlag
*/
public void sortByMethod(List list, final String method,
final boolean reverseFlag) {
Collections.sort(list, new Comparator
出力:
[1|wm 123|3|1992-12-01,2|a 234|8|1995-12-01,3|m 456|12|1990-12-01]Memberデフォルトソート(持参したcompareTo方法で)後...[2|a 234|8|1995-12-01,3|m 456|12|1990-12-01,1|wm 123|3|1991-12-01,1|wm 123|3|1992-12-01]Member逆シーケンス(持参したcompareTo方法で)後...[1|wm 123|3|1992-12-01,3|m 456|1990-12-01,2|a 234|8|8|8|8|8|1992-01,2-01,|a 234|1995-12-01][2]a 234|8|1995-12-01,3|m 456|12|1990-12-01,1|wm 123|1993-12-01]Memberフィールドレベルでソート後...[1|wm 123|3|1992-12-01,2|a 234|8|1995-12-01,3|m 456|12-01,3|1990-12-01]Memberフィールド生年月日逆シーケンス後...[2|a 234|8|1995-12-01,1|wm 1233|1992-12-01,3|m 456|12-01,1990-12-01]