在Java中,有没有一种方法可以检查以下条件:
“单个字符是否出现在字符串x中”
而不需要使用循环?
在Java中,有没有一种方法可以检查以下条件:
“单个字符是否出现在字符串x中”
而不需要使用循环?
indexOf()
函数的解决方案在内部使用循环。没有任何答案给出正确的解决方案,如果有人敢于提出一个新问题,人们会宣布它为“重复”。真的令人失望 ;( - Prashant Prabhakar SinghString.contains()
:检查字符串是否包含指定的字符序列String.indexOf()
:返回字符串中指定字符或子字符串的第一个出现位置的索引(此方法有4种变体)String.contains(""+c)
。 - Felix Neumeyer我不确定原帖作者确切在问什么。由于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);
}
另一个解决方案不太优雅,但更完整...
/**
* 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;
}
当然,随着您需要支持越来越长的字符串,行数也会增加。但是根本没有循环/递归。如果您担心length()使用了循环,则甚至可以删除长度检查。
您可以使用String
类中的2种方法。
String.contains()
检查字符串是否包含指定的字符值序列String.indexOf()
返回字符串中指定字符或子字符串的第一次出现的索引,如果未找到该字符则返回-1(此方法有4个变体)方法1:
String myString = "foobar";
if (myString.contains("x") {
// Do something.
}
方法2:
String myString = "foobar";
if (myString.indexOf("x") >= 0 {
// Do something.
}
链接来自:Zach Scrivena
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");
}
如果你需要经常检查同一个字符串,可以预先计算字符出现的次数。以下是一种使用长整型数组中包含位数组的实现:
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;
}}
要检查字符串中是否不存在某个字符,您至少需要查看字符串中的每个字符。因此,即使您不明确使用循环,它的效率也是相同的。话虽如此,您可以尝试使用str.contains(""+char)。
int index = string.indexOf(character);
return index != -1;
&& string.lastIndexOf(character) != index
? - GreenAsJadeString.contains(String)
或者String.indexOf(String)
- 建议使用
"abc".contains("Z"); // false - correct
"zzzz".contains("Z"); // false - correct
"Z".contains("Z"); // true - correct
"and".contains(""); // true - correct
"and".contains(""); // false - correct
"and".indexOf(""); // 0 - correct
"and".indexOf(""); // -1 - correct
String.indexOf(int)
和经过深思熟虑的 String.indexOf(char)
,其中 char 转为 int
时需要进行扩展。
"and".indexOf("".charAt(0)); // 0 though incorrect usage has correct output due to portion of correct data
"and".indexOf("".charAt(0)); // 0 -- incorrect usage and ambiguous result
"and".indexOf("".codePointAt(0)); // -1 -- correct usage and correct output
char
或Character
的值是单个字符?不可以。在Unicode字符的上下文中,char
或Character
有时可以 作为单个字符的一部分
,逻辑上不应被视为完整的单个字符
。
任何支持Unicode字符编码的系统都应该将Unicode的代码点视为单个字符。
因此,Java应该明确而清晰地做到这一点,而不是向用户公开太多的内部实现细节。
String
类在抽象层面上做得不好(虽然需要混淆性强的封装理解
才能理解抽象并因此形成了一个反模式
)。
char
的使用有什么不同?char
只能映射到基本多语言平面中的字符。
只有codePoint-int
才能涵盖Unicode字符的完整范围。
char
在内部被视为16位
无符号值,使用UTF-16内部表示时,不能仅用2字节
表示所有的Unicode字符。有时,需要将一个16位
范围内的值与另一个16位
值组合才能正确定义字符。
不过,在使用indexOf
、charAt
、length
等方法时,不要过于冗长。真诚地希望Java能添加新的UnicodeString
和UnicodeCharacter
类,并具有清晰定义的抽象。
contains
而不是indexOf(int)
?char
。char
不足够indexOf
接受一个int
,但char
到int
转换掩盖了这一点,用户可能会做类似于str.indexOf(someotherstr.charAt(0))
的操作(除非用户了解确切的上下文)。CharSequence
(也就是String
)更好。 public static void main(String[] args) {
System.out.println("and".indexOf("".charAt(0))); // 0 though incorrect usage has correct output due to portion of correct data
System.out.println("and".indexOf("".charAt(0))); // 0 -- incorrect usage and ambiguous result
System.out.println("and".indexOf("".codePointAt(0))); // -1 -- correct usage and correct output
System.out.println("and".contains("")); // true - correct
System.out.println("and".contains("")); // false - correct
}
char
可以处理大多数实际使用情况。但在编程环境中使用 codepoints 以便未来扩展性更好。codepoint
应该可以处理几乎所有与编码相关的技术用例。codepoint
抽象级别的范围。int
太昂贵(加倍),存储层可以选择 char
接口。除非存储成本是唯一的指标,否则仍然最好使用 codepoint
。此外,最好将存储视为 byte
并将语义委托给围绕存储构建的业务逻辑。codepoint
应该成为最低级别的接口,其他语义可以在运行时环境中围绕 codepoint
构建。