0

ここで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 つのミニクラスを持ちたい人はいますか?

誰かが私が見るためにいくつかの代替例を提供できますか?

4

1 に答える 1

1

並べ替えのサンプルをいくつか示します。日付または逆アルファベットの並べ替えを実行していません (これは課題です)。2 つの家を値と比較するインライン コメントに注意してください0

public class HouseSorter {

    enum Status {
        SOLD, AVAILABLE, CONTINGENT;
    }

    /**
     * Immutable house (if a house is sold or not does not change a house, use a
     * Map instead).
     */
    private static class House {
        private final String city;

        House(String city) {
            this.city = city;
        }

        public String getCity() {
            return city;
        }

        @Override
        public String toString() {
            return "House in " + city;
        }

        @Override
        public boolean equals(Object obj) {
            if (obj == null) {
                return false;
            }
            if (!House.class.isAssignableFrom(obj.getClass())) {
                return false;
            }
            return this.city.equalsIgnoreCase(((House) obj).city);
        }

        @Override
        public int hashCode() {
            return city.hashCode();
        }
    }

    public static SortedSet<House> sortAlphabetically(Set<House> houses) {
        TreeSet<House> sortedHouses = new TreeSet<House>(
                new Comparator<House>() {
                    @Override
                    public int compare(House o1, House o2) {
                        return o1.getCity().compareTo(o2.getCity());
                    }
                });
        sortedHouses.addAll(houses);
        return sortedHouses;
    }

    public static SortedSet<House> sortByStatus(
            final Map<House, Status> houseStatusMap) {
        TreeSet<House> sortedHouses = new TreeSet<House>(
                new Comparator<House>() {
                    @Override
                    public int compare(House o1, House o2) {
                        int compareByStatus = houseStatusMap.get(o1).compareTo(
                                houseStatusMap.get(o2));
                        if (compareByStatus != 0) {
                            return compareByStatus;
                        }
                        // you need an additional compare, until none of the
                        // houses compare with result 0
                        // otherwise the houses would be equal and therefore
                        // removed from the set
                        return o1.getCity().compareTo(o2.getCity());
                    }
                });
        sortedHouses.addAll(houseStatusMap.keySet());
        return sortedHouses;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        final Map<House, Status> houseStatusMap = new HashMap<House, Status>();
        House house0 = new House("Beverwijk");
        houseStatusMap.put(house0, Status.SOLD);
        House house1 = new House("Opmeer");
        houseStatusMap.put(house1, Status.SOLD);
        House house2 = new House("Amstelveen");
        houseStatusMap.put(house2, Status.AVAILABLE);
        House house3 = new House("Haarlem");
        houseStatusMap.put(house3, Status.CONTINGENT);

        System.out.println(sortAlphabetically(houseStatusMap.keySet()));
        System.out.println(sortByStatus(houseStatusMap));
    }
}
于 2013-06-20T22:55:52.760 に答える