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

具有预定义顶级结果的自定义Java比较器

微生阳平
2023-03-14

我想按字母顺序对字段名列表进行排序,但是我需要在比较器的doCompare方法中包含一个条件,以便如果字段名是“pk”,则始终将其排序到列表的顶部。我所拥有的内容如下,但我不确定我是否采取了正确的方法,特别是reurn值为-1000。对此的任何建议都将不胜感激。

    @Override
    public int doCompare(Object firstRec, Object secondRec)
    {
        MyField firstField = (MyField) firstRec;
        MyField secondField = (MyField ) secondRec;
        if(firstField.name() == "pk")
        {
            return -1000;
        }

        return StringUtils.compareStrings(firstField.name().toLowerCase(), secondField.name().toLowerCase());
     }

共有1个答案

庄嘉
2023-03-14

比较器的要求(以及通过扩展,应该像Comparator.compare)在Javadoc中描述:

实现者必须确保所有 x 和 y 的 sgn(compare(x, y)) == -sgn(compare(y, x))。 (这意味着 compare(x, y) 必须引发异常,当且仅当 compare(y, x) 引发异常。

实现者还必须确保关系是可传递的:< code>((compare(x,y)

最后,实现者必须确保< code>compare(x,y)==0意味着< code>sgn(compare(x,z))==sgn(compare(y,z)) for all z

假设<code>StringUtils。比较正确地实现了这些要求,但您错误的是第一个要求:您还需要考虑<code>secondField的情况:

编写正确的比较器s的一般模式是:

int firstComparison = /* compare something about firstField and secondField */;
if (firstComparison != 0) {
  return firstComparison;
}

int secondComparison = /* compare something else about firstField and secondField */;
if (secondComparison != 0) {
  return secondComparison;
}

// ...

return 0;

在这里应用:

int pkComparison = Boolean.compare(secondField.name().equals("pk"), firstField.name().equals("pk"));
if (pkComparison != 0) {
  return pkComparison;
}

int compareStringsComparison = StringUtils.compareStrings(firstField.name().toLowerCase(), secondField.name().toLowerCase());
if (compareStringsComparison != 0) {
  return compareStringsComparison;
}

return 0;

显然,最后一个if语句是多余的,因为无论它是否为零,您总是返回<code>comparestingscomparison</code>值;所以你可以简单地写:

return StringUtils.compareStrings(firstField.name().toLowerCase(), secondField.name().toLowerCase());

我建议坚持使用< code > compare/check and return/finally return 0 模式,因为以后更容易添加附加条件。但不管怎样都不可怕。

 类似资料:
  • 在我的PriorityQueue中,我有两种类型的客户,即VIP和常规客户。我想先为贵宾服务,再为常客服务。 如果CustomerID<100,则视为VIP。 如果客户是VIP,他会排在队列中VIP部分的最后 更新:我不想排序任何其他列除了VIP。我不想添加“日期”,因为它感觉像是一个黑客,而不是理解Java是如何工作的。

  • 我使用的是PriorityQueue和我自己的比较器,但最终结果并不总是好的。我应该按平均成绩、姓名、身份证进行排序。最后,它应该返回队列中剩余的名称。其余的名字都很好,但顺序不同。输入(名称、平均等级、识别号): 预期产出: 我的结果: 你能帮我找出问题所在吗?提前谢谢你!

  • 我也可以使用相同的比较器按Id对列表进行排序吗?

  • priority_queue,comparator(query,d)>min_heap; main.cpp:20:7:注意:“comparator”不是文字,因为: class comparator{ main.cpp:20:7:注意:“comparator”不是聚合,没有普通的默认构造函数,也没有不是复制或移动构造函数的constexpr构造函数 Main.cpp:92:65:注意:应为类型,但

  • 我创建了一个自定义比较器,可以按降序对获胜数进行排序,但我不确定它是如何工作的,有人能解释一下这是如何按降序排序的吗?

  • 问题内容: 我想为汽车清单开发一个排序演示。我正在使用数据表显示汽车列表。现在实际上我想按汽车颜色对列表进行排序。这里不是按字母顺序排序的。我想使用我的自定义排序顺序,例如先是红色汽车,然后是蓝色,等等。 为此,我尝试使用,但它只允许按字母顺序排序。 因此,任何人都可以指导我实现使用该技术的方法,以便使排序变得更快。 问题答案: 我建议你为汽车颜色创建一个枚举,而不要使用字符串,并且枚举的自然顺序