首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java比较器:两个排序标准

问Java比较器:两个排序标准
EN

Stack Overflow用户
提问于 2013-06-06 17:57:04
回答 1查看 821关注 0票数 0

我有一个简单的类,其中包含一个字符串(name)和一个整数(age)。应存储在集合中的对象不能有双Name值,并应按降序年龄排序。第一个代码示例删除了所有重复名称,但不包含第二个排序条件:

代码语言:javascript
复制
public int compare(Person p1, Person p2) {  
    int reVal = 1;

       if(p1.getName().compareTo(p2.getName()) != 0){
       reVal = 1;       
       }
       else {
       reVal = 0;       
       }                               
         return reVal;                  
    } 

下一个示例比较器将对不包含任何双名称的对象的rest集进行排序:

代码语言:javascript
复制
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语句已经检查了两个对象的名称是否相等。为什么会发生这种情况?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-06 18:10:42

这里有一个基本问题:您希望同时测试unicity并对条目进行排序。没有内置集合可以同时检查条目是否相等以及它们的比较是否为0。

例如,两个Set实现是HashSet和TreeSet

  • HashSet使用Object的.equals()/.hashCode()测试equality;
  • TreeSet使用Comparator (或对象的Comparable功能,如果它们实现了它)来测试等价性。

这不完全是一回事。事实上,对于一个特定的JDK类,即BigDecimal,这可能会非常令人惊讶:

代码语言:javascript
复制
final BigDecimal one = new BigDecimal("1");
final BigDecimal oneDotZero = new BigDecimal("1.0");

final Set<BigDecimal> hashSet = new HashSet<>();
// BigDecimal implements Comparable of itself, so we can use that
final Set<BigDecimal> treeSet = new TreeSet<>();

hashSet.add(one);
hashSet.add(oneDotZero);
// hashSet's size is 2: one.equals(oneDotZero) == false

treeSet.add(one);
treeSet.add(oneDotZero);
// treeSet's size is... 1! one.compareTo(oneDotZero) == 0

你们不能既有蛋糕又吃蛋糕。在这里,你想要根据名称测试单一性,并根据年龄进行比较,您必须使用Map。

要获得经过排序的人员列表,您必须以列表的形式复制此地图的.values()并使用Collections.sort()。如果您使用的是Guava,那么后面的部分就像Ordering.natural().sortedCopy(theMap.values())一样简单,前提是您的值实现了Comparable。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16959072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档