在Java中,如何确定char数组是否包含特定字符?

时间:2013-09-02 22:24:05

标签: java arrays

这就是我所拥有的:

char[] charArray = new char[] {'h','e','l','l','o'};

我想写下以下内容:

if(!charArray contains 'q'){
     break;
}

我意识到.contains()不能在这里使用。我只是用“包含”来说明我正在尝试做什么。

7 个答案:

答案 0 :(得分:26)

以下片段测试“不包含”条件,如问题中的示例伪代码所示。对于具有显式循环的直接解决方案,请执行以下操作:

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
}

答案 1 :(得分:4)

这种方法可以解决问题。

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

答案 2 :(得分:3)

这是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'语句。

答案 3 :(得分:1)

您可以遍历数组,也可以将其转换为String并使用indexOf

if (new String(charArray).indexOf('q') < 0) {
    break;
}

创建一个新的String有点浪费,但它可能是最简洁的代码。您还可以编写一种模拟效果的方法,而不会产生开销。

答案 4 :(得分:1)

如果您不想要自己的&#34; Utils&#34; -class:

,还有其他一些选择

使用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'));
}

或使用内置Arrays

@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类允许在数组中查找子数组。

答案 5 :(得分:0)

来自NumberKeyListener来源code。这个方法用于检查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迭代器,可能会更快一些。

答案 6 :(得分:-2)

您还可以将这些字符定义为字符串列表。然后,您可以使用list.Contains(x)方法检查字符是否对可接受的字符有效。