如何检查单个字符是否出现在字符串中?

bar*_*oon 185 java string validation character

在Java中有一种方法来检查条件:

"这个单个字符是否出现在字符串x中"

没有使用循环?

mP.*_*mP. 252

你可以用string.indexOf('a').

如果'a'存在string,则返回索引(> = 0).如果不是,则返回-1.因此,非负返回值意味着'a' is present in the string.

  • 这不是Barfoon所问的.B希望避免在B代码中进行循环.当然,在所有String都是一个包含在一个包含许多有用方法的好类中的字符数组之后,API需要进行循环. (21认同)
  • 但是这个电话背后总是有一个循环,因为你无法找到符号. (6认同)
  • 这些答案如何获得如此多的赞成?使用`indexOf()`的解决方案在内部使用循环.没有一个答案给出正确的解决方案,如果有人敢问一个新问题,人们会宣称它是"重复".真的很失望;( (4认同)
  • @PrashantPrabhakarSingh我没有看到如果没有循环可以做到这一点.字符串或多或少是一组字符.如果它是一个组(集合,数组等),那么无论它是本机代码的内部还是外部,我都希望你需要一个循环才能在"组"中找到一些东西.我相信"不使用循环?" 更像是"没有写我自己的循环?". (4认同)
  • indexOf()在内部使用循环. (3认同)

Zac*_*ena 136

  • String.contains() 检查字符串是否包含指定的char值序列
  • String.indexOf() 返回指定字符或子字符串的第一个出现的字符串中的索引(此方法有4种变体)

  • 要将String.contains()与单个char一起使用,请执行以下操作:**String.contains(Character.toString(c))** (24认同)
  • char不是CharSequence所以它不能传递给String.contains(CharSequence). (14认同)
  • 如果您喜欢短代码,请执行此操作:`String.contains(""+ c)` (6认同)

Jac*_*eow 31

我不确定原始海报究竟是在问什么.由于indexOf(...)和contains(...)两者都可能在内部使用循环,或许他正在寻找是否有可能没有循环?我可以想到两种方法,一种方法当然是复发:

public boolean containsChar(String s, char search) {
    if (s.length() == 0)
        return false;
    else
        return s.charAt(0) == search || containsChar(s.substring(1), search);
}
Run Code Online (Sandbox Code Playgroud)

另一个不那么优雅,但完整性......:

/**
 * Works for strings of up to 5 characters
 */
public boolean containsChar(String s, char search) {
    if (s.length() > 5) throw IllegalArgumentException();

    try {
        if (s.charAt(0) == search) return true;
        if (s.charAt(1) == search) return true;
        if (s.charAt(2) == search) return true;
        if (s.charAt(3) == search) return true;
        if (s.charAt(4) == search) return true;
    } catch (IndexOutOfBoundsException e) {
        // this should never happen...
        return false;
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

当你需要支持更长和更长的字符串时,行数增加.但根本没有循环/重复.如果您担心该length()使用循环,您甚至可以删除长度检查.

  • 如果您将递归定义为非循环过程,那么您就是一个极客:D +1用于创造性. (9认同)
  • 纠正我,如果我错了,我觉得在一天结束时,一个递归是一个伪装的循环不是吗?在某些情况下,它可能会导致比普通循环更多的内存消耗. (3认同)

小智 12

String temp = "abcdefghi";
if(temp.indexOf("b")!=-1)
{
   System.out.println("there is 'b' in temp string");
}
else
{
   System.out.println("there is no 'b' in temp string");
}
Run Code Online (Sandbox Code Playgroud)


Hal*_*cht 6

您可以使用String该类中的2种方法。

  • String.contains() 检查字符串是否包含指定的char值序列
  • String.indexOf() 它返回指定字符或子字符串首次出现的字符串中的索引,如果找不到该字符,则返回-1(此方法有4种变化)

方法1:

String myString = "foobar";
if (myString.contains("x") {
    // Do something.
}
Run Code Online (Sandbox Code Playgroud)

方法2:

String myString = "foobar";
if (myString.indexOf("x") >= 0 {
    // Do something.
}
Run Code Online (Sandbox Code Playgroud)

链接作者:Zach Scrivena


小智 5

如果您需要经常检查相同的字符串,您可以预先计算字符出现次数。这是一个使用包含在长数组中的位数组的实现:

public class FastCharacterInStringChecker implements Serializable {
private static final long serialVersionUID = 1L;

private final long[] l = new long[1024]; // 65536 / 64 = 1024

public FastCharacterInStringChecker(final String string) {
    for (final char c: string.toCharArray()) {
        final int index = c >> 6;
        final int value = c - (index << 6);
        l[index] |= 1L << value;
    }
}

public boolean contains(final char c) {
    final int index = c >> 6; // c / 64
    final int value = c - (index << 6); // c - (index * 64)
    return (l[index] & (1L << value)) != 0;
}}
Run Code Online (Sandbox Code Playgroud)