【发布时间】:2013-06-20 21:37:10
【问题描述】:
我在这里整理了一个 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。
如果您不想阅读代码中的 cmets,我想根据以下条件进行排序:
- 状态.可用
- 状态.已售出
- 状态.条件
- 城市(按字母顺序)
- 城市(字母倒序)
- 日期(上市最短天数)
- 日期(上市时间最多)
我对它进行了一些阅读,看起来人们建议将其制成 TreeSet 以进行排序和使用比较器。我见过很多例子,人们要么为比较器创建一个单独的类,要么使指定的类实现可比较。
我还没有看到有人编写了一个额外的类来处理所有的排序。这可能吗?如果是这样,有人可以告诉我从哪里开始吗?这些比较似乎比典型的整数比较稍微复杂一些。
编辑澄清
当按 Status.AVAILABLE 排序时,我希望 Set 让对象按以下方式显示:
- Status.AVAILABLE(在顶部/第一)
- Status.CONTINGENT(在 Status.AVAILABLE/秒之后)
- Status.SOLD(在 Status.CONTINGENT/last 之后)
当按 Status.CONTINGENT 排序时,我希望按如下方式排序:
- 状态.CONTINGENT
- 状态.已售出
- 状态.可用
当按 Status.SOLD 排序时,我希望集合按如下方式排序:
- 状态.已售出
- 状态.CONTINGENT
- 状态.可用
编辑 #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 个迷你类?
谁能提供一些替代的例子让我看看?
【问题讨论】:
-
根据
Status.AVAILABLE排序是什么意思?这是一个枚举? -
@RohitJain 我的意思是,所有的
Status.AVAILABLE在集合的顶部。我将编辑我的帖子以澄清。 -
使用
TreeSet并提供Comparator<YourClass>。 -
@WilliamShatner 是的,因此您需要不同的
TreeSets 来以不同的方式对数据进行排序。你的最终目标是什么?顺便说一句,最好有一个List<YourObject>并使用Collections#sort,每次都提供一个自定义的Comparator<YourObject>。 -
您可以在每个方法上使用自定义比较器,并使用
TreeSet(Comparator)构造函数和TreeSet#addAll方法。还是不明白做SetSorter.sortXxx的主要目的。
标签: java sorting comparison hashset treeset