ここでSSCCEをまとめました:
House.java :
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class House {
private Status currentStatus;
private String city;
private Date date;
public enum Status { AVAILABLE,
SOLD,
CONTINGENT
}
public House(Status s, String c, String d) throws ParseException {
currentStatus = s;
city = c;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
date = sdf.parse(d);
}
}
SortingTest.java :
import java.text.ParseException;
import java.util.HashSet;
import sortingtest.House.Status;
public class SortingTest {
public static void main(String[] args) throws ParseException {
HashSet<House> houses = new HashSet<House>();
houses.add(new House(Status.AVAILABLE, "New York City", "2007-11-11"));
houses.add(new House(Status.SOLD, "Los Angeles", "2005-06-11"));
houses.add(new House(Status.AVAILABLE, "Chicago", "2012-05-03"));
houses.add(new House(Status.CONTINGENT, "Portland", "2007-10-11"));
//Sort HashSet of House objects by criteria listed below
//sort by Status.AVAILABLE
//call sort
//System.out.println("Sorted by available");
//iterate set and print out sorted houses
//sort by Status.SOLD
//call sort
//System.out.println("Sorted by sold");
//iterate set and print out sorted houses
//sort by Status.CONTINGENT
//call sort
//System.out.println("Sorted by contingent");
//iterate set and print out sorted houses
//sort by City
//call sort
//System.out.println("Sorted alphabetically by City");
//iterate set and print out sorted houses
//sort by City
//call sort
//System.out.println("Sorted reverse alphabetically by City");
//iterate set and print out sorted houses
//sort by Date (newest)
//call sort
//System.out.println("Sorted by newest date (fewest days on market)");
//iterate set and print out sorted houses
//sort by Date (oldest)
//call sort
//System.out.println("Sorted oldest date (most days on market)");
//iterate set and print out sorted houses
}
}
SetSorter
したがって、最終的には、特定の形式で並べ替えられた Set を返すメソッドを呼び出すだけのクラスを作成したいと考えています。
コード内のコメントを読みたくない場合のために、以下に基づいて並べ替えたいと思います。
- Status.AVAILABLE
- Status.SOLD
- Status.Contingent
- 都市 (アルファベット順)
- 都市 (アルファベットの逆順)
- 日付(市場での最短日数)
- 日付(市場に出回るほとんどの日)
私はそれについて少し読んだことがありますが、ソートしてコンパレータを使用するために TreeSet にすることを人々が提案しているようです。人々がコンパレーターのためだけに別のクラスを作成するか、指定されたクラスを同等に実装するいくつかの例を見てきました。
私が見たことがないのは、誰かがすべてのソートを処理するために余分なクラスを書いていることです。これは可能ですか?もしそうなら、誰かがどこから始めればよいか教えてもらえますか? これらは、典型的な整数比較よりも少し複雑な比較のようです。
明確にするために編集
Status.AVAILABLEでソートする場合、Set に次のようにオブジェクトを表示させたいと思います。
- Status.AVAILABLE (上/最初)
- Status.CONTINGENT (Status.AVAILABLE/秒後)
- Status.SOLD (Status.CONTINGENT/last の後)
Status.CONTINGENTでソートする場合、セットを次のようにソートします。
- Status.CONTINGENT
- Status.SOLD
- Status.AVAILABLE
Status.SOLDでソートする場合、セットを次のようにソートします。
- Status.SOLD
- Status.CONTINGENT
- Status.AVAILABLE
編集#2最終目標:
メソッドを呼び出すだけでセットをソートできるクラスが必要です。
すなわち:
//sort by date
SetSorter.sortByData(treeSet); //returns TreeSet sorted by date
//sort by city
SetSorter.sortByCity(treeSet); //returns TreeSet sorted by City
//sort by other criteria
編集 #3
class SortByCity implements Comparator<House> {
@Override
public int compare(House h1, House h2) {
return h1.getCity().compareTo(h1.getCity());
}
}
houses = new TreeSet(new SortByCity());
これはこれを行う簡単な方法だと思いますが、これらはすべて小さなクラスであり、(私の意見では)面倒に見えます。.java 内に 7 つのミニクラスを持ちたい人はいますか?
誰かが私が見るためにいくつかの代替例を提供できますか?