【发布时间】:2013-06-06 09:57:04
【问题描述】:
我有一个简单的类,它包含一个字符串(姓名)和一个整数(年龄)。应存储在集合中的对象不得具有双重名称值,并且应按年龄降序排序。 第一个代码示例删除了所有双名,但不包含第二个排序标准:
public int compare(Person p1, Person p2) {
int reVal = 1;
if(p1.getName().compareTo(p2.getName()) != 0){
reVal = 1;
}
else {
reVal = 0;
}
return reVal;
}
下一个示例比较器将对不包含任何双重名称的其余对象集进行排序:
public int compare(Person p1, Person p2) {
boolean ageGt = (p1.getAge() > p2.getAge());
int reVal = 1;
if(p1.getName().compareTo(p2.getName()) != 0){
if(scoreGt)
reVal = -1;
else
reVal = 1;
}
else {
reVal = 0;
}
return reVal;
}
第二个比较器根据对象的年龄值正确地对对象进行排序,但它允许使用双重名称,我不明白,因为外部 if 语句已经检查了两个对象的名称是否相等。为什么会这样?
【问题讨论】:
-
双名是什么意思?
-
@kocko 我认为他的意思是他不能有两个具有相同名称的对象,因此如果它们确实具有相同的名称,则它们被认为是相等的。
-
Comparator不是用于测试唯一性。如果你想测试名字的唯一性,你应该使用Map,名字作为键,人作为值。 -
compare用于根据某种排序比较对象。不涉及过滤,因此已排序(有序)集合与未排序集合具有相同数量的对象。如果您需要唯一性,就您的名称而言,请尝试使用专用的 .hashCode() 方法将对象放入一个集合中。 -
我使用了一个集合,并且第一段代码按预期工作,并且不允许添加第二个元素,该元素的名称已包含一个元素。但是,第二段代码不起作用。我想我忘了实现 hashCode() 方法。
标签: java collections comparator