比较Java

时间:2015-09-26 19:27:08

标签: java string

我正在编写一个方法,如果其中一个字符串出现在另一个字符串的最后,并且字符串不同,则返回true。我们不能使用endsWith()

例如:

  • 如果a =" all"并且b =" ball",该方法将返回true。

  • 如果a ="是"并且b ="是",该方法将返回false。

这是我到目前为止所做的,但它一直说字符串索引超出范围= -1

public static boolean startOther(String a, String b){
    if(a.equals(b))
        return false;
    int pos=a.indexOf(b);
    int pos1=b.indexOf(a);
    int len=a.length();
    int len1=b.length();
    if(pos>-1 && a.substring(len-pos).equals(b)|| pos1>-1 && b.substring(len1-pos1).equals(a))
        return true;
    return false;
}

4 个答案:

答案 0 :(得分:2)

这有点“在你跳跃之前看”,但你想要做的是:

  • 检查另一个字符串中的索引位置。
  • 如果(且仅当)索引位置存在,请检查该索引点一直到结束的子字符串是否匹配。
  • 否则,返回false。

如果你进行任何类型的减法,你将不会得到正确的子串大小;也就是说,如果你减去你要检查的字符串的长度,你只会得到一个字符。

lastIndexOf

这是评论中指出的相同代码的更优化形式。从根本上说它是相同的,但你不需要对子字符串执行另一个等号检查,因为public static boolean startOther(String left, String right) { if (left == null || right == null || left.equals(right)) { return false; } int rightSubstringInLeft = left.lastIndexOf(right); int leftSubstringInRight = right.lastIndexOf(left); if(rightSubstringInLeft != -1) { return rightSubstringInLeft == left.length() - right.length(); } else if(leftSubstringInRight != -1) { return leftSubstringInRight == right.length() - left.length(); } else { return false; } } 只会给你整个子字符串的最后一个索引。

store_PL

答案 1 :(得分:2)

length()regionMatches(int toffset, String other, int ooffset, int len)的组合应该非常有效:

public static boolean startOther(final String a, final String b) {
    final int aLength = a.length();
    final int bLength = b.length();
    return aLength != bLength && (aLength > bLength ? a.regionMatches(aLength - bLength, b, 0, bLength)
                                                    : b.regionMatches(bLength - aLength, a, 0, aLength));
}

答案 2 :(得分:1)

由于您无法使用 int state = (mode) ? View.VISIBLE : View.GONE; l.btn1.setVisibility(state); l.btn2.setVisibility(state); l.btn3.setVisibility(state); l.btn4.setVisibility(state); } ,因此请先对endsWith进行测试。然后得到长度。测试它们不一样。检查{0}的indexOf + length是否相等。像

这样的东西
null

我测试过

true

并获得(请求的)输出

public static boolean startOther(String a, String b) {
    if (a == null || b == null) return false;
    int aLen = a.length();
    int bLen = b.length();
    if (aLen != bLen) {
        if (aLen < bLen) {
            int p = b.indexOf(a);
            return p != -1 && p + aLen == bLen;
        } else {
            int p = a.indexOf(b);
            return p != -1 && p + bLen == aLen;
        }
    }
    return false;
}

答案 3 :(得分:1)

indexOf(String s)

<强>返回:     指定子字符串第一次出现的索引,如果没有这种情况,则为-1。

如果indexOf()返回-1并且您致电a.substring(len-pos),则参数将为len - (-1) = len + 1。这是out of range的原因。

这种情况总是在你的代码中发生,因为有两条镜像线:

int pos=a.indexOf(b);
int pos1=b.indexOf(a);

如果在方法调用之前检查了equals,则pos之一将始终为-1。很明显:如果一个字符串包含另一个字符串,并且它们不相等,则第二个字符串不包含第一个字符串。