我有两个字符串(它们可以是任何字符串),例如I am a boy
和I am a man
。 I am a
常见的地方。我的任务是找出两个字符串中的常用词。
我使用Set<String>
来存储数据,但它只存储唯一值。所以我的问题是,如何从两个字符串中获得常用词?
例如,上面的两个句子应该产生结果{"I", "am", "a"}
,即两个句子共有的单词集。
答案 0 :(得分:1)
而不是使用Set<String>
更好地使用Map<String,Integer>
来存储每个单词的出现次数。
答案 1 :(得分:1)
您可以使用Map
。对字符串进行标记并将其存储到Map中。令牌应该是关键,值应该是计数。现在的价值是2.应该是常见的。
答案 2 :(得分:1)
如果我正确理解你的问题,你想要计算两个集合的交集,其中集合中的元素是句子中的单词。 Set.retainAll(Collection)
可以为您做到这一点。
String str1 = "I am already a man";
String str2 = "I am but a boy";
Set<String> intersection = new HashSet<>(Arrays.asList(str1.split(" ")));
intersection.retainAll(Arrays.asList(str2.split(" ")));
System.out.println(intersection);
将输出[am, a, I]
Set.retainAll(Collection)
:
仅保留此集合中包含在指定集合中的元素(可选操作)。换句话说,从该集合中删除未包含在指定集合中的所有元素。
答案 3 :(得分:0)
尝试这样的事情
String s1 = "I am a boy and";
String s2 = "I am a man";
StringBuilder sb = new StringBuilder();
for (String i : s1.split(" ")) {
if (s2.contains(i)) {
sb.append(i);
sb.append(" ");
}
}
System.out.println("common strings: "+sb.toString());
Out put:
common strings: I am a
您也可以使用retainAll()来完成此操作。
String s1 = "I am a boy and";
String s2 = "I am a and man";
Set<String> set1= new HashSet<>(Arrays.asList(s1.split(" ")));
Set<String> set2= new HashSet<>(Arrays.asList(s2.split(" ")));
set1.retainAll(set2);
System.out.println(set1);
答案 4 :(得分:0)
为什么不存储Map<String, Integer>
?您需要的是一个大于1的字符串。
E.g。如果你有两个字符串
String a = "I am a boy";
String b = "I am a man";
String[] a_words = a.split("\\s+");
String[] b_words = b.split("\\s+");
Map<String, Integer> wordCountMap = new Treemap<String, Integer>();
for (String s : a_words) ...
for (String s : b_words) ...
for (String word : wordCountMap.keySet())
if (wordCountMap.get(word) > 1)
System.out.println(word + " is in both strings.");
请注意,通过此结构,您可以识别k
字符串中常见的字词,适用于任何k > 0
。
如果您愿意使用Guava,那么您也可以使用Multiset<String>
代替地图。