检查Character-array是否包含Java中较小的Character-array中的所有元素

时间:2014-09-18 20:27:24

标签: java arrays comparison nested-loops

我试图比较两个字符数组,其中第一个数组比第二个数组长一个字符。我想看看更大的数组是否包含较小数组中的所有字符。

例如,给定数组:

char[] biggest = {'a', 'b', 'c', 'd', 'e'};  //5 elements
char[] smallest = {'c', 'b', 'd', 'a'};  //4 elements

比较这些应该评估为true,因为较小的数组包含字符c,b,d和a,所有这些都包含在最大的数组中(无论顺序如何)。

现在,我正在思考:

  • 以for循环开始,循环遍历最大的数组,一次一个字符
  • 查看当前字符是否可以在最小的数组中找到
  • 如果匹配,则增加matchCounter。
  • 这样做直到最大阵列结束
  • 如果matchCounter等于smallestArray.length,则返回true。

以下是我的代码:

int matchCounter = 0;
//For each character in the biggest array
for(int i = 0; i < biggest.length; i++) {
    //Loop through the smallest array
    for(int j = 0; j < smallest.length; j++) {
        if(biggest[i] == smallest[j]) {  //See if the current character in the biggest array exists anywhere in the smallest array
            matchCounter++;
        }
    }
}

非常感谢任何帮助!

**更新**

运行之后,我没有得到预期的答案。我认为当我有包含重复字符的数组时会出现问题:

例如

char[] biggest = {'s', 'e', 'e', 'i', 'n', 'g'};
char[] smallest = {'e', 'e', 'i', 'g', 'n'};

    /*Loop to compare biggest and smallest, incrementing matchCounter when equal. */

    //If the biggest array has a matchCount equal to the smallest array (means the biggest array contains all the characters in the smallest array, plus an additional character)
    if(matchCounter == word.length()) {
        System.out.println("Suggested word: " + foundWord);
    }

因为它似乎工作正常!

2 个答案:

答案 0 :(得分:2)

你的方法会给出正确的答案,但它很慢,因为你保证每次都在每个数组中循环,给出 O(n 2 运行时。

在保持类似方法的同时,提高速度的一种方法是对更大的集合进行排序。这允许您对较小集合中的每个字符进行二进制搜索,而不是每次都必须一直迭代:

    int matchCounter = 0;
    Arrays.sort(biggest);
    for (char c : smallest) {
        if (Arrays.binarySearch(biggest, c) >= 0) {
            matchCounter++;
        }
    }
    System.out.println(matchCounter); // 4

答案 1 :(得分:1)

使用Set

public static boolean allContained(char[] big, char[] small) {
    Set<Character> chars = new HashSet<>(big.length);
    for(char c : big) {
        chars.add(c);
    }
    for(char c : small) {
        if(!chars.contains(c)) {
            return false;   // small contains elements that are not in big
        }
    }
    return true;
}