Я выброшен вместе образуют SSCCE здесь:Как отсортировать объекты HashSet на основе этих критериев?
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 для сортировки и с помощью компаратора. Я видел несколько примеров, когда люди либо создают отдельный класс только для компаратора, либо делают сопоставление указанного класса.
То, что я еще не видел, это кто-то пишет дополнительный класс для обработки всей сортировки. Это возможно? Если да, может кто-нибудь покажет мне, с чего начать? Они кажутся немного более сложными сравнениями, чем типичные целые сравнения.
Edit для осветления
При сортировке по Status.AVAILABLE Я хотел бы, чтобы иметь набор объектов появляются на:
- Status.AVAILABLE (сверху/первый)
- Status.CONTINGENT (после статуса. НАЛИЧИЕ/в секундах)
- Status.SOLD (после Status.CONTINGENT/последний)
При сортировке по Status.CONTINGENT Я хочу набор отсортированных следующим образом:
- Status.CONTINGENT
- Status.SOLD
- Status.AVAILABLE
При сортировке по Статус.ПРОДАНО Я хочу набор отсортированных следующим образом:
- Status.SOLD
- Status.CONTINGENT
- Status.AVAILABLE
Edit # 2 Конечная цель:
I хотел бы иметь класс, где я могу просто вызвать методы сортировки набора.
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
Edit # 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'? Это перечисление? –
@RohitJain Я имею в виду, все 'Status.AVAILABLE' в верхней части набора. Я отредактирую свой пост, чтобы уточнить. – WilliamShatner
Используйте «TreeSet» и предоставьте «Компаратор». –