我想创建一个方法,该方法返回字符串中单词的数量,这些单词在字符串数组中没有出现单词。我想只使用java.lang包中的任何东西来实现这个逻辑。
public int count(String a, String[] b) {
}
E.g。
count(" hey are you there ", new String[]{ "are", "i", "am"})
将返回3,因为有"是"在字符串中。
首先,我想我必须使用string.split函数将字符串转换为字符串数组。有什么想法吗?
答案 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)
你的逻辑应该有点像这样:
拆分a
,对。现在你有一个单词列表。在现实生活中,您可能还应该尝试澄清要求 - 究竟什么是“单词”?一个合理的假设是它是一系列非空白字符,但可能是不同的东西(例如,一系列字母)。
迭代a
并检查每个单词是否在b
中。如果不是,请递增计数器。但是每次检查都是b
中的线性搜索,导致O(nm)的总复杂度,所以......
在迭代之前,将b
转换为HashSet
。这是一个线性操作,但是你的主循环也将成为线性操作,因此总复杂度将为O(m + n)。
如果必须针对不同的字符串重复执行此操作,但是相同的单词列表,请考虑创建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;
}