在Java中,如何确定char数组是否包含特定字符?
这就是我所拥有的:
char[] charArray = new char[] {'h','e','l','l','o'};
我想写一些东西效果:
if(!charArray contains 'q'){ break; }
我意识到.contains()不能在这里使用。 我只是用“包含”来说明我正在尝试做什么。
以下片段测试“不包含”条件,如问题中的示例伪代码所示。 对于具有显式循环的直接解决方案,请执行以下操作:
boolean contains = false; for (char c : charArray) { if (c == 'q') { contains = true; break; } } if (!contains) { // do something }
另一种选择,使用String
提供contains()
方法的事实:
if (!(new String(charArray).contains("q"))) { // do something }
还有一个选择,这次使用indexOf()
:
if (new String(charArray).indexOf('q') == -1) { // do something }
这是Oscar的第一个版本的变体,它不使用for-each循环。
for (int i = 0; i < charArray.length; i++) { if (charArray[i] == 'q') { // do something break; } }
你可以在循环之前将一个布尔变量设置为false,然后使“do something”将变量设置为true,这可以在循环之后进行测试。 循环也可以包含在函数调用中,然后使用'return true'而不是break,并在for循环后添加'return false'语句。
这种方法可以解决问题。
boolean contains(char c, char[] array) { for (char x : array) { if (x == c) { return true; } } return false; }
用法示例:
class Main { static boolean contains(char c, char[] array) { for (char x : array) { if (x == c) { return true; } } return false; } public static void main(String[] a) { char[] charArray = new char[] {'h','e','l','l','o'}; if (!contains('q', charArray)) { // Do something... System.out.println("Hello world!"); } } }
替代方式:
if (!String.valueOf(charArray).contains("q")) { // do something... }
您可以遍历数组,也可以将其转换为String
并使用indexOf
。
if (new String(charArray).indexOf('q') < 0) { break; }
创建一个新的String
有点浪费,但它可能是最简洁的代码。 您还可以编写一种模拟效果的方法,而不会产生开销。
如果您不想要自己的“Utils”类,还有其他一些选项:
使用Apache commons lang( ArrayUtils ):
@Test public void arrayCommonLang(){ char[] test = {'h', 'e', 'l', 'l', 'o'}; Assert.assertTrue(ArrayUtils.contains(test, 'o')); Assert.assertFalse(ArrayUtils.contains(test, 'p')); }
或者使用内置数组 :
@Test public void arrayTest(){ char[] test = {'h', 'e', 'l', 'l', 'o'}; Assert.assertTrue(Arrays.binarySearch(test, 'o') >= 0); Assert.assertTrue(Arrays.binarySearch(test, 'p') < 0); }
或者使用Google Guava中的Chars类:
@Test public void testGuava(){ char[] test = {'h', 'e', 'l', 'l', 'o'}; Assert.assertTrue(Chars.contains(test, 'o')); Assert.assertFalse(Chars.contains(test, 'p')); }
稍微偏离主题,Chars类允许在数组中查找子数组。
来自NumberKeyListener源代码 。 这个方法用于检查char是否包含在已定义的接受字符数组中:
protected static boolean ok(char[] accept, char c) { for (int i = accept.length - 1; i >= 0; i--) { if (accept[i] == c) { return true; } } return false; }
它与@ÓscarLópez解决方案类似。 由于缺少foreach迭代器,可能会更快一些。