当前位置: 首页 > 知识库问答 >
问题:

Java比较器:两个排序准则

淳于知
2023-03-14
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-语句已经检查了两个对象的名称是否相等。为什么会这样?

共有1个答案

范瀚昂
2023-03-14

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

例如,两个set实现是hashsettreeset:

  • hashset使用对象.equals()/.hashcode()测试相等性;
  • Treeset使用比较器(或者对象的'carable功能,如果它们实现的话)来测试相等性。

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

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

鱼与熊掌不可兼得。在这里,要根据名称测试unicity并根据年龄进行比较,必须使用映射

 类似资料:
  • 问题内容: 我有一个简单的类,其中包含一个字符串(名称)和一个整数(年龄)。应存储在集合中的对象不得具有双名值,并且应根据年龄的降序进行排序。第一个代码示例删除所有双精度名称,但不包含第二个排序条件: 下一个示例比较器将对其余对象集进行排序,该对象集不包含任何重复名称: 第二个比较器正确地根据对象的年龄值对它们进行排序,但是它允许使用重复名称,我不明白,因为外部if语句已经检查了两个对象的名称是否

  • 我有以下课程:

  • 问题内容: 我正在尝试根据用户输入对对象列表进行排序。如何使sort方法实现变体比较器? 例: 如何根据需要根据getKey / getModified /其他任意属性进行上述排序? 问题答案: 如果所有“键”都将链接到getter方法,则可以在函数中使用键/ getter的静态映射: 注意:我们将不得不使用原始类型,因为我们不能使用不同的类型(即使所有的获取方法都将返回对象,也会有所不同) 然后

  • “StringComparator”在“arrays.sort(b,new StringComparator());”出货量和预期的一样。 但当我使用默认排序(步骤如下),然后按“StringComparator”排序时,bug显示: “Arrays.Sort(a);Arrays.Sort(a,new StringComparator());”

  • 问题内容: 在Java中,我想比较两个地图,如下所示,我们是否有现有的API可以做到这一点? 谢谢 问题答案: 我将使用Set的removeAll()功能来设置键的差异,以查找添加和删除的内容。可以通过使用设置为HashMap的条目进行设置差异来检测实际更改。Entry同时使用键和值实现equals()。 输出量