我想按字母顺序对字段名列表进行排序,但是我需要在比较器的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());
}
比较器
的要求(以及通过扩展,应该像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:注意:应为类型,但
我创建了一个自定义比较器,可以按降序对获胜数进行排序,但我不确定它是如何工作的,有人能解释一下这是如何按降序排序的吗?
问题内容: 我想为汽车清单开发一个排序演示。我正在使用数据表显示汽车列表。现在实际上我想按汽车颜色对列表进行排序。这里不是按字母顺序排序的。我想使用我的自定义排序顺序,例如先是红色汽车,然后是蓝色,等等。 为此,我尝试使用,但它只允许按字母顺序排序。 因此,任何人都可以指导我实现使用该技术的方法,以便使排序变得更快。 问题答案: 我建议你为汽车颜色创建一个枚举,而不要使用字符串,并且枚举的自然顺序