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

问题描述 投票:0回答:1

我正在使用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

我现在正在做的是:

  1. 获取密钥集并将其保存到ArrayList

  2. 使用比较器对ArrayList排序

  3. 通过使用排序列表打印出地图中的值

这是我的代码:

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

我使比较器具有这样的想法,即应该首先对字母字符串进行排序,然后对数字字符串进行排序,但是现在我怀疑比较器的逻辑是否正确。谁能指出我正确的方向?

java android comparator
1个回答
0
投票
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);

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

}

因此,您似乎确实想删除!

您可能还应该涵盖所有情况。有条件是否应该涵盖比较案例

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

或巢

if (TextUtils.isDigitsOnly(o1)) {
    if (TextUtils.isDigitsOnly(o2)) {
        ...
    } else {
        ...
    }
} else {
    if (TextUtils.isDigitsOnly(o2)) {
        ...
    } else {
        ...
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.