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

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

不使用循环?


当前回答

如果不使用循环/递归至少检查一次字符串,您将无法检查char是否出现在某些字符串中(像indexOf这样的内置方法也使用循环)

如果不是。如果你在字符串中查找一个字符,x比字符串的长度要多得多,我建议使用Set数据结构,因为这比简单地使用indexOf更有效

String s = "abc";

// Build a set so we can check if character exists in constant time O(1)
Set<Character> set = new HashSet<>();
int len = s.length();
for(int i = 0; i < len; i++) set.add(s.charAt(i));

// Now we can check without the need of a loop
// contains method of set doesn't use a loop unlike string's contains method
set.contains('a') // true
set.contains('z') // false

使用set,你将能够在常数时间O(1)检查字符是否存在于字符串中,但你也将使用额外的内存(空间复杂度将是O(n))。

其他回答

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

如果字符a出现在string中:

它返回中字符第一次出现的索引 对象表示的字符序列,或-1 性格不会出现。

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");
}

这是你要找的吗?

int index = string.indexOf(character);
return index != -1;

如果不使用循环/递归至少检查一次字符串,您将无法检查char是否出现在某些字符串中(像indexOf这样的内置方法也使用循环)

如果不是。如果你在字符串中查找一个字符,x比字符串的长度要多得多,我建议使用Set数据结构,因为这比简单地使用indexOf更有效

String s = "abc";

// Build a set so we can check if character exists in constant time O(1)
Set<Character> set = new HashSet<>();
int len = s.length();
for(int i = 0; i < len; i++) set.add(s.charAt(i));

// Now we can check without the need of a loop
// contains method of set doesn't use a loop unlike string's contains method
set.contains('a') // true
set.contains('z') // false

使用set,你将能够在常数时间O(1)检查字符是否存在于字符串中,但你也将使用额外的内存(空间复杂度将是O(n))。

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

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;
}}