字符串中不在字符串数组中的单词数

时间:2016-03-13 05:46:30

标签: java

我想创建一个方法,该方法返回字符串中单词的数量,这些单词在字符串数组中没有出现单词。我想只使用java.lang包中的任何东西来实现这个逻辑。

public int count(String a, String[] b) {

}

E.g。

count("  hey   are  you there    ", new String[]{ "are", "i", "am"})

将返回3,因为有"是"在字符串中。

首先,我想我必须使用string.split函数将字符串转换为字符串数组。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

您可以简单地执行以下操作:

public int count(String a, String[] b) {
    int count = b.length;
    for(String s : b) if(a.contains(s)) count--;
    return count;
}

编辑:我可能感到困惑,我认为您希望b中的#字符串不在a中(在您的示例中,它仍然是3)。在这种情况下,根据您的示例,split似乎不方便,除非您使用regex,因此您可以使用String[]创建Scanner

public int count(String a, String[] b) {
    ArrayList<String> words = new ArrayList<String>();
    Scanner scan = new Scanner(a);
    while(scan.hasNext()) words.add(scan.next());

    int count = words.size();
    for(String s : words) if(/*b contains s*/) count--;
    return count;
}

答案 1 :(得分:0)

你的逻辑应该有点像这样:

  1. 拆分a,对。现在你有一个单词列表。在现实生活中,您可能还应该尝试澄清要求 - 究竟什么是“单词”?一个合理的假设是它是一系列非空白字符,但可能是不同的东西(例如,一系列字母)。

  2. 迭代a并检查每个单词是否在b中。如果不是,请递增计数器。但是每次检查都是b中的线性搜索,导致O(nm)的总复杂度,所以......

  3. 在迭代之前,将b转换为HashSet。这是一个线性操作,但是你的主循环也将成为线性操作,因此总复杂度将为O(m + n)。

  4. 如果必须针对不同的字符串重复执行此操作,但是相同的单词列表,请考虑创建WordCounter类,这样您只需在构造函数中创建HashSet一次。

答案 2 :(得分:0)

按照步骤完成任务。

  • 使用StringTokenizer标记字符串a
  • 将字符串数组b转换为Collection,以便检查它是否包含给定的标记。
  • 使用循环从token获取下一个StringTokenizer并检查它是否包含在List中。

-

尝试下面的代码,它会起作用。

编辑:使用java.util包。

public int count(String a, String[] b) {
    java.util.StringTokenizer tokenizer = new java.util.StringTokenizer(a);
    java.util.List bList = java.util.Arrays.asList(b);
    int tokens = tokenizer.countTokens();
    int counter = tokens;
    for(int i=0;i<tokens;i++) {
        String token = tokenizer.nextToken().trim();
        if(bList.contains(token)) {
            counter--;
        }
    }
    return counter;
}

通过使用它,你可以只用一个for循环来获得计数器。

编辑::仅使用java.lang个包。

public int count(String a, String[] b) {
    String[] words = a.split(" ");
    int tokens = words.length;
    int wordCount = 0;
    int counter = 0;
    for(int i=0;i<tokens;i++) {
        String token = words[i].trim();
        if(token.length() <= 0) {
            continue;
        }
        wordCount++;
        for(String bItem : b) {
            if(bItem.equals(token)) {
                counter++;
                break;
            }
        }
    }
    return wordCount - counter;
}