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

使用自定义比较器会导致排序不一致

羊舌和安
2023-03-14

我正在使用Android应用程序,我想以某种方式打印HashMap的键和值。假设以下是HashMap的内容:

11: 000010
12: 102643
24: 877
3: 990000
h: 6008770000
m: 0800

我想以这样一种方式打印HashMap键和值,即字母键首先按字母顺序打印,然后是数字键按升序打印:

h: 6008770000
m: 0800
3: 990000
11: 000010
12: 102643
24: 877

我现在做的是:

> < li>

获取密钥集并将其保存到数组列表中

使用比较器对数组列表进行排序

使用排序列表打印出地图中的值

这是我的代码:

List<String> keyList = new ArrayList<>(requestMap.keySet());
Collections.sort((keyList), comparator);
for(String key : keyList) {
    Log.d(key, requestMap.get(key));
}

Comparator<String> comparator = (o1, o2) -> {
    if (o1 == null) return -1;
    else if (o2 == null) return 1;

    if(TextUtils.isDigitsOnly(o1) && TextUtils.isDigitsOnly(o2)) {
        return Integer.compare(Integer.parseInt(o1), Integer.parseInt(o2));
    }

    if(!TextUtils.isDigitsOnly(o1)) {
        return -1;
    } else {
        return o1.compareTo(o2);
    }
};

到目前为止,它还在工作,但是在某些情况下,我没有得到想要的顺序。例如,对于特定的地图,我总是得到以下结果:

3: 005000
4: 000000058985
12: 095508
22: 022
h: 6008770000
m: 0221
11: 000004
13: 0120
24: 877
25: 00
35: 77690088000000131D20077100000F
37: QWERTY123456
41: 00000003
42: 100000004000000
48: 456789123451       0000050201
60: 000001
61: 0201020000000045000000000300000000000015000102000000049770000000049770000000001659

我制作比较器的想法是字母字符串应该首先排序,然后是数字字符串,但现在我怀疑我的比较器逻辑是否正确。有人能给我指出正确的方向吗?

共有1个答案

房时铭
2023-03-14
if(TextUtils.isDigitsOnly(o1) && TextUtils.isDigitsOnly(o2)) {
    return Integer.compare(Integer.parseInt(o1), Integer.parseInt(o2));
}

因此,处理两个都是数字的情况。

if(!TextUtils.isDigitsOnly(o1)) {
    return -1;

这是第一个包含非数字的情况。这是返回-1,即使第二个有非数字。当两者都是非数字时,我们应该进行比较。

} else {
    return o1.compareTo(o2);

这是第一个是数字的情况,所以不想比较。因为我们已经排除了两个都是数字,所以第二个必须是非数字(尽管我们不应该比较)。

}

因此,看起来您确实想要删除< code >!!

您可能还应该涵盖所有案例。要么有一个条件,您是否应该涵盖比较案例

!TextUtils.isDigitsOnly(o1) && !TextUtils.isDigitsOnly(o2)

或巢

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

  • 如何使用Comparator对对象的ArrayList进行正确排序,然后将排序后的数组传递给自定义数组适配器? 我试过这样做: ArrayList的内容类: 比较器: 在OnCreate中设置适配器: ...因为我使用的是定制的ArrayAdapter,就像: 我需要如何修改此适配器以使其与其他适配器一起工作? 谢谢你的帮助。

  • 让我们假设我有一个类,它不实现,还有一个类,它实现。 使用AssertJ的fluent API,我现在假设可以执行以下操作: 由于不实现可比,将返回类型,并且由于也返回,所以我无法访问和方法,这些方法在接口中声明。 'only'返回而不返回有什么原因吗? 当然,我可以按照的内容重写上面的断言,但是表达式本身并不特别易读,而且如果出现故障,生成的消息('expected:<-1>大于:<0>)不会提

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

  • 下面的代码片段适用于条件1,但不适用于条件2。

  • 问题内容: 我想使用比较器按降序对对象进行排序。 在这里,我想对一个Person对象数组进行排序。 我怎样才能做到这一点? 问题答案: 你可以使用这种方法来覆盖用户定义的类的降序方法,从而覆盖compare()方法, 或通过使用用户Prince在其评论中提到的降序进行排序。 你可以像这样进行升序排序, 我们用简洁的Lambda表达式(从Java 8开始)替换上面的代码: 从Java 8开始,Lis