比较字符串的字符是否存在于字符数组中

时间:2019-04-30 08:20:42

标签: java

我希望用户输入一个字符串,然后我要检查此字符串中的每个字符是否存在于我创建的字符数组中。即使顺序不正确。

我要解决的方法是初始化字符数组,然后使用扫描仪从用户那里输入字符串。

public static char[]aa={'A','C','D','E','F','G','H','I','K','L','M','N','P','Q','R','S','T','V','W','Y','U','O','B','J','Z','X'};

我创建了一个函数

private static void isValidSequence(String sequence, char[] k) {
    outter :for (int j = 0; j < sequence.length(); j++) {
        for (int i = 0; i < k.length; i++) {
            if(sequence.charAt(j) == k[i]){
                break;
            } else {     
                System.out.println("invalid"); 
                break outter;
            }
       }     
    }
}

发生的事情是,例如,如果字符串的第一个字母与数组的第一个输入不匹配,它将给我一个“无效”的输入。我该如何解决?并在给出无效输出之前遍历整个字符数组。

5 个答案:

答案 0 :(得分:1)

一种方法是sort您的数组,然后使用Binary Search Algorithm (BSA)

// sort the array once
Arrays.sort(aa);

// iterate over the input string
for(int i = 0, length = sequence.length(); i < length; i++) {
    // the java implementation of the BSA returns negative numbers for not found elements
    if(Arrays.binarySearch(aa, sequence.charAt(i)) < 0) {
        // char was not found, break loop
        return;
    }
} 

注意:如果数组未排序/无法排序,则BSA是无用的,并且会产生不确定的结果。

注2:BSA(O(log n))比简单迭代(O(n))更快

答案 1 :(得分:0)

这也可以如下进行:

char[]aa={'A','C','D','E','F','G','H','I','K','L','M','N','P','Q','R','S','T','V','W','Y','U','O','B','J','Z','X'};

String s = "aStrinG";

for (char c : s.toCharArray()) {
    for (char c2 : aa) {
       if (c2 == c) {
          System.out.println("String char " + c + " exists in char array");
       }
    }
}

它产生:

String char S exists in char array
String char G exists in char array

答案 2 :(得分:0)

最好的方法是使用SET而不是数组。一个集合不包含重复的元素,然后只需使用方法contains()

即可使用它

使用Java 9(不可修改的集合)

Set<Character> alphabetSet = Set.of('A', 'B', 'C');

//Another way
//Set<Character> alphabetSet = new HashSet<>(Arrays.asList('A', 'B', 'C'));

for(char c: sequence)
{
    if(alphabetSet.contains(c)){
      //do something
    }
    else{
      //do something
    }
}

详细了解Set: https://docs.oracle.com/javase/7/docs/api/java/util/Set.html

答案 3 :(得分:0)

要直接回答您的问题: 解决方案1: 使用继续而不是中断,这将在每次字符不在k中时都显示“无效”。

解决方案2: 您可以使用计数器,并在每次k中没有一个字符时将其递增,然后在循环外部您可以看到有多少个无效字符。

解决方案3: 如果需要更多详细信息,可以有一个字符列表,并将每个无效字符添加到此列表中。这样一来,您就可以准确了解哪些字符无效。

我不确定您要做什么,所以我不知道哪种方法更适合您,例如,您还可以使用完全使用流的方法。

答案 4 :(得分:0)

如果您开始使用提供的Collection,则可以使用Set进行检查。

首先,将数组转换为Set

char[] array = "abcdefghijklmnopqrstuvwxyz".toCharArray();

Set<Character> setAllowed = new TreeSet<>();
for(char c : array){
    setAllowed.add(c);
}

然后,您只需要迭代并检查每个字符。我将添加另一个Set来检索每个不允许的字符,以提供更好的输出。

Set<Character> setError = new TreeSet<>();
for(char c : s.toCharArray()){
    if(setAllowed.contains(c)){
        setError.add(c);
    }
}

测试:

public static void main(String[] args) {
    String s = "foobar123";
    char[] array = "abcdefghijklmnopqrstuvwxyz".toCharArray();

    //INIT
    Set<Character> setAllowed = new TreeSet<>();
    Set<Character> setError = new TreeSet<>();
    for(char c : array){
        setAllowed .add(c);
    }

    //RESEARCH
    for(char c : s.toCharArray()){
        if(setAllowed.contains(c)){
            setError.add(c);
        }
    }

    //OUTPUT
    System.out.println(setError);
}
  

[1、2、3]