Я собрал здесь 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
, где я могу просто вызвать метод, который будет возвращать набор, отсортированный в определенном формате.
Если вы не хотите читать комментарии в коде, я хочу отсортировать на основе:
- Статус.ДОСТУПЕН
- Статус.ПРОДАНО
- Статус.Контингент
- Город (по алфавиту)
- Город (в обратном порядке по алфавиту)
- Дата (наименьшее количество дней на рынке)
- Дата (большинство дней на рынке)
Я немного почитал об этом, и похоже, что люди предлагают превратить его в TreeSet для сортировки и использования компаратора. Я видел несколько примеров, когда люди либо создают отдельный класс только для компаратора, либо делают реализацию указанного класса сопоставимой.
Чего я не видел, так это того, что кто-то написал дополнительный класс для обработки всей сортировки. Это возможно? Если да, может ли кто-нибудь показать мне, с чего начать? Это кажется несколько более сложным сравнением, чем обычное целочисленное сравнение.
Изменить для уточнения
При сортировке по Status.AVAILABLE я бы хотел, чтобы в наборе отображались объекты:
- Статус.ДОСТУПЕН (сверху/сначала)
- Status.CONTINGENT (после Status.AVAILABLE/сек)
- Status.SOLD (после Status.CONTINGENT/последний)
При сортировке по Status.CONTINGENT я хочу, чтобы набор сортировался следующим образом:
- Статус.КОНТИНГЕНТ
- Статус.ПРОДАНО
- Статус.ДОСТУПЕН
При сортировке по Status.SOLD я хочу, чтобы набор сортировался следующим образом:
- Статус.ПРОДАНО
- Статус.КОНТИНГЕНТ
- Статус.ДОСТУПЕН
Изменить конечную цель №2:
Я хотел бы иметь класс, в котором я могу просто вызывать методы для сортировки набора.
Ie:
//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());
Я думаю, что это был бы простой способ сделать это, но все это были бы маленькие классы и (на мой взгляд) выглядели бы беспорядочно. Кто хочет иметь 7 мини-классов внутри .java?
Может ли кто-нибудь предоставить мне несколько альтернативных примеров?
Status.AVAILABLE
? Это перечисление? - person Rohit Jain   schedule 21.06.2013Status.AVAILABLE
в верхней части набора. Я отредактирую свой пост, чтобы уточнить. - person WilliamShatner   schedule 21.06.2013TreeSet
и укажитеComparator<YourClass>
. - person Luiggi Mendoza   schedule 21.06.2013TreeSet
для разных способов сортировки данных. Какова ваша конечная цель для начала? Судя по тому, как это выглядит, было бы лучше иметьList<YourObject>
и использоватьCollections#sort
, предоставляя каждый раз пользовательскийComparator<YourObject>
. - person Luiggi Mendoza   schedule 21.06.2013TreeSet(Comparator)
вместе сTreeSet#addAll
. Все еще не понимаю основной цели выполненияSetSorter.sortXxx
. - person Luiggi Mendoza   schedule 21.06.2013SortedSet
, что бы вы ни делали, так как обычные экземплярыSet
не нужно сортировать. Таким образом, в основном ваш метод создаст собственный компаратор и поместит все элементыSet
вSortedSet
, вероятно,TreeSet
. Обратите внимание, что если вы сделаете это, вы скопируете только ссылки. - person Maarten Bodewes   schedule 21.06.2013