繁体   English   中英

比较字符串

[英]Comparing character strings

因此,我有一个比较插入的两个字符数组的方法(s和t,其中s是字符数组,如果更小则应返回true),目的是找出一个是否小于另一个(按字典顺序)到前n个字符。

public boolean lessCheck(char[] s, char[] t, int n) {
            int q = 0;
            if (t.length < n || s.length < n) {
                if (s.length != t.length) {
                    if (t.length < s.length) {
                        q = t.length;
                    } else {
                        q = s.length;
                    }
                } else {
                    q = t.length;
                }
            } else {
                q = n;
            }

            for (int i = 0; i < q; i++) {
                if (t[i] != s[i]) {
                    if (t[i] > s[i]) {
                        return true;
                    } else {
                        return false;
                    }
                }
            }

            if (equal(s, t, n)) {
                return false;
            } else {
                return true;
            }
        }

我遇到的问题是,每当我

s =绑定,t = bin,n = 7,我是对的。

这应该返回false,因为bind小于字典顺序中的bin。

有什么帮助吗?

s =绑定,t = bin,n = 7,我是对的。

当称为q = 3

对?

for循环比较3个字符b,i,n

对?

最后的if语句使用equal方法。 bindbin的长度不同并且小于n。

等于返回假,对吗?

从最后一个ifelse块获得的最终结果为true。

对?

String类定义了一个compareTo方法,该方法应满足您的要求:

https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#compareTo(java.lang.String)

new String("bind").compareTo("bin")>0
new String("bin").compareTo("zoo")<0
new String("bin").compareTo("bin")==0

问题似乎与这段代码有关:

        for (int i = 0; i < q; i++) {
            if (t[i] != s[i]) {
                if (t[i] > s[i]) {
                    return true;
                } else {
                    return false;
                }
            }
        }

那应该是

        for (int i = 0; i < q; i++) {
            if (t[i] != s[i]) {
                if (t[i] > s[i]) {
                    return true;
                } else if (t[i] < s[i]) {
                    return false;
                }
            }
        }

实际上,如果条件t [i]> s [i]不为真,则仍需要检查t [i] <s [i]是否为假。

我认为您算法的一个更紧凑的版本是:

public static boolean lessThan(char[] s, char[] t, int n) {

    int minLength = Math.min(Math.min(s.length, t.length), n);

    for (int i = 0; i < minLength; i++) {
        if (s[i] < t[i]) {
            return true;
        } else if (s[i] > t[i]) {
            return false;
        }
    }

    return (minLength < n && s.length < t.length) ? true : false;
}

希望对您有所帮助!

您的equals方法返回false因为数组长度不同,然后,由于equals返回false ,您的lessThan方法返回true

比较了几乎所有字符后,调用equals方法毫无意义。 而不是调用equals方法,只需检查s是否小于t:

return s.length() < t.length();

如果子数组相等并且一个子数组短于另一个子数组,则意味着它将被放置在字典中较长数组的前面。

对不起,无法抗拒找到q的逻辑。 无需找到此q。

尝试这个:

public boolean lessThan(char[] s, char[] t, int n) {
    int i = 0, j = 0, q = 0;
    while (i < s.length && i < t.length && (i < n)) {
        if (s[i] > t[i])
            return false;
        i++;
    }
    if (s.length > t.length)
        return false;
    else if (n < i)
        return true;
    return true;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM