【问题标题】:How to manually lexicographically compareTo "abcd" & ""abcde" effectively如何有效地手动按字典顺序比较“abcd”和“abcde”
【发布时间】:2016-07-12 07:46:25
【问题描述】:

我想写自己的 compareTo 方法,所以我写了这个简单的代码:

public int myCompare(String a, String b) {
    int min = Math.min(a.length(), b.length());

    for (int i=0; i < min; i++) {
        int diff = a.charAt(i) - b.charAt(i);
        if (diff == 0) {
            continue;
        } else {
            return diff;
        }
    }
    // meaning both strings are equals so far
    if (a.length() == b.length()) {
        return 0;
    } else if (a.length() > b.length()) {
        return -1;
    } else {
        return 1;
    }
}

好吧,这段代码运行良好,但我讨厌最后一个 if/else 声明——你有什么建议可以改进这段代码吗?

【问题讨论】:

    标签: java compareto lexicographic


    【解决方案1】:

    这取决于你想自己写多少。你可以使用

    return a.length() - b.length(); // as length is non-negative
    

    return Integer.compareTo(a.length(), b.length());
    

    在你的第一个循环中你也可以写

    for (int i = 0; i < a.length() && i < b.length(); i++) {
        int diff = a.charAt(i) - b.charAt(i);
        if (diff != 0)
            return diff;
    }
    

    【讨论】:

    • @AndyTurner 是的,但 char - charintbyte - bytebyte % byte 一样:P
    • 是的,在我写完之后才意识到。请注意,我仍然更喜欢 WrappedPrimitive.compare 方法。
    • @AndyTurner 我经常想知道为什么程序员如此害怕基础数学,以至于更复杂的表达式更有吸引力。
    • 我鼓动我的原因是为了避免减法溢出的问题。我猜你没有遇到“比int短”类型的问题;但我想我刚刚印上了“使用比较”模式。我想,这只是另一件事要忘记。
    • @AndyTurner 当您是初学者时,您会打破所有规则,因为您不知道它们是什么,当您成为高级开发人员时,您必须学习规则,当您成为专家时,您知道当违反规则有意义时,您应该知道有些人会认为这是违反规则的,这是评论为什么这样做的好时机。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多