为了账号安全,请及时绑定邮箱和手机立即绑定

是否可以在排序中更改某些符号的优先级(权重)?

是否可以在排序中更改某些符号的优先级(权重)?

www说 2021-12-30 17:18:19
我想为字符串值创建一个比较器,但根据https://www.cs.cmu.edu/~pattis/15-1XX/common/handouts/ascii.html下划线符号比任何数字都具有更大的价值。有可能以某种方式改变它吗?
查看完整描述

2 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

简答


是的。您需要一个自定义字符串比较器。


解决方案


假设您需要对字符串列表进行排序:


[a_123, ab123, a123, 123, _123]

如果您使用排序,Collections.sort那么它将按以下顺序排序:


[123, _123, a123, a_123, ab123]

但是您想覆盖_. 为此,您需要一个自定义字符串比较器。让我们复制和修改一下java.lang.String#compareTo:


private int customStringComparator(String s1, String s2) {

    int len1 = s1.length();

    int len2 = s2.length();

    int lim = Math.min(len1, len2);

    char v1[] = s1.toCharArray();

    char v2[] = s2.toCharArray();


    int k = 0;

    while (k < lim) {

        char c1 = v1[k];

        char c2 = v2[k];

        // You can add your custom comparison here:

        if ('_' == c1 && Character.isDigit(c2)) {

            // We intentionally return inverted result

            return c2  - c1;

        }else if(c1 != c2) {

            return c1 - c2;

        }

        k++;

    }

    return len1 - len2;

}

现在我们可以将我们的传递customStringComparator给Collections.sort:


Collections.sort(list, this::customStringComparator);

该列表将按以下顺序排序:


[_123, 123, a_123, a123, ab123]

如您所见,现在_前面的数字。


查看完整回答
反对 回复 2021-12-30
?
慕哥6287543

TA贡献1831条经验 获得超10个赞

这可能有效:


private int compareStrings(String o1, String o2) {

    if(o1.matches("\\d+") && o2.equals("_")) {

        return 1;

    }

    if(o1.equals("_") && o2.matches("\\d+")) {

        return -1;

    }

    return o1.compareTo(o2);

}

然后像这样定义你的比较器:


Comparator<String> stringComparator2 = this::compareStrings;

编辑:


根据不为_中间的字符串工作,如何仅替换_为 ASCII 表中之前的字符以进行比较(" "例如):


public static int compareStrings(String o1, String o2) {

    o1 = o1.replaceAll("_", " ");

    o2 = o2.replaceAll("_", " ");

    return o1.compareTo(o2);

}


查看完整回答
反对 回复 2021-12-30
  • 2 回答
  • 0 关注
  • 192 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号