我有一个与Java Collections框架一起玩的任务。我需要从数据库中获取用户列表,并将其存储在集合中。 (这已完成,用户存储在HashSet中)。每个用户都是Person类的实例,其中描述了姓名,姓氏,出生日期,加入日期以及其他一些现在不重要的参数。接下来,我需要将列表存储在不同的集合中(没有说明有多少)提供按以下方式对它们进行排序的功能:
- 仅限姓名
- 姓名,出生日期
- 加入日期
好的,首先,我的Person只将数据存储为字符串(我应该将日期更改为Date吗?)。我已经开始使用“by name,surname,birthdate”实现排序,因为这是我在使用Strings调用sort
列表后得到的结果。我是对的吗?
public List createListByName(Set set){
List ret = new ArrayList<String>();
String data = "";
for(Object p: set){
data = p + "\n";
ret.add(data);
}
Collections.sort(ret);
return ret;
}
但其余的是什么?这是我的Person
:
class Person {
private String firstname;
private String lastname;
)..)
Person(String name, String surname, (..)){
firstname = name;
lastname = surname;
(..)
}
@Override
public String toString(){
return firstname + " " + lastname + " " + (..);
}
}
答案 0 :(得分:2)
我不会将所有内容转换为字符串开头。我会实施Comparator<Person>
,然后对List<Person>
:
public List<Person> createListByName(Set<Person> set){
List<Person> ret = new ArrayList<Person>(set);
Collections.sort(ret, new NameSurnameBirthComparator());
return ret;
}
NameSurnameBirthComparator
会实施Comparator<Person>
并比较两个人首先比较他们的名字,然后比较他们的姓氏(如果他们的名字相同),然后是他们的出生日期(如果他们的姓氏相等)。
这样的事情:
public int compare(Person p1, Person p2) {
// TODO: Consider null checks, and what to do :)
int firstNameResult = p1.getFirstName().compareTo(p2.getFirstName());
if (firstNameResult != 0) {
return firstNameResult;
}
int surnameResult = p1.getSurname().compareTo(p2.getSurname());
if (surnameResult != 0) {
return surnameResult;
}
return p1.getBirthDate().compareTo(p2.getBirthDate());
}
是的,我会将出生日期存储为Date
- 或者最好是LocalDate
来自JodaTime,因为这是一个更好的图书馆对于日期和时间操纵:)
答案 1 :(得分:0)
所以我应该在Person上为每个任务编写多个comprator?
鉴于这是一项家庭作业,我会说这是你开始学习比较器的方法。
为了感兴趣,只有你可以通过创建几个可恢复的比较器来实现这一点。
您可以使用Bean Comparator对各个属性进行排序。
然后,您可以使用Group Comparator对多个属性进行排序。