20

这是我所拥有的:

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

我想写一些大意为:

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

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

4

7 回答 7

33

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

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
}
于 2013-09-02T22:25:22.193 回答
5

这种方法可以解决问题。

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...
}
于 2013-09-02T22:45:54.283 回答
3

这是 Oscar 第一个版本的变体,它不使用 for-each 循环。

for (int i = 0; i < charArray.length; i++) {
    if (charArray[i] == 'q') {
        // do something
        break;
    }
}

您可以在循环之前将布尔变量设置为 false,然后让“做某事”将变量设置为 true,您可以在循环之后对其进行测试。循环也可以包装在一个函数调用中,然后只使用'return true'而不是break,并在for循环之后添加一个'return false'语句。

于 2013-09-02T22:41:45.190 回答
3

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

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

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

于 2013-09-02T22:27:20.630 回答
3

如果您不想要自己的“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 类允许在数组中查找子数组。

于 2016-12-13T10:58:10.333 回答
0

来自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 迭代器,可能会更快一些。

于 2017-07-15T20:54:40.260 回答
-1

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

于 2019-08-01T11:14:50.700 回答