字符串匹配操作

时间:2014-02-17 12:13:07

标签: java string string-matching

我有两个字符串(它们可以是任何字符串),例如I am a boyI am a manI am a常见的地方。我的任务是找出两个字符串中的常用词。

我使用Set<String>来存储数据,但它只存储唯一值。所以我的问题是,如何从两个字符串中获得常用词?

例如,上面的两个句子应该产生结果{"I", "am", "a"},即两个句子共有的单词集。

5 个答案:

答案 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]


来自javadoc的

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>代替地图。