检查该单词是否存在另一个字符串中的所有单词

时间:2010-12-25 02:09:40

标签: java

如何检查字符串#2中的所有单词是否存在于字符串#1中?它应该不区分大小写,我希望在比较单词时排除所有标点符号和特殊字符。

任何帮助?

感谢。

5 个答案:

答案 0 :(得分:7)

算法

  1. 遍历String#1中的单词并将它们作为键插入到字典/散列/关联数组中。
  2. 遍历字符串#2中的单词并检查每个单词是否是步骤1中创建的字典中的键。
    • 如果找不到,请返回false。
    • 迭代完成后,返回true。
  3. 运行时间:O(n)

    我会让别人用Java实现这个。

答案 1 :(得分:0)

要在字符串中查找单词而忽略各种标点符号等,可以使用StringTokenizer类。

  StringTokenizer st = new StringTokenizer("Your sentence;with whatever. punctuations? might exists", " :?.,-+=[]");

使用第二个示例中提供的分隔符将String分解为令牌。然后,您可以使用hasMoreTokens()和nextToken()方法迭代标记。

然后你可以使用@MattDiPasquale建议的算法。

答案 2 :(得分:0)

您可以尝试String的内置split method

看起来像

public String[] split(String regex)

并根据您使用的正则表达式返回一个Strings数组。上面的链接中有一些例子。

您可以通过这种方式轻松生成两个数组(一个用于String#1,另一个用于String#2)。

对数组进行排序,然后检查数组是否相等。 (规模和顺序)


如果您使用java.util.Arrays

,则可以简化数组排序

Java中的数组有很多库方法,您应该了解它们,因为它们有时非常有用: http://leepoint.net/notes-java/data/arrays/arrays-library.html

这比使用您选择的分隔符构建字典/散列表/ ADT效率稍差(如在MattDiPasquale的答案中),但如果您不熟悉散列函数或字典(作为数据类型),则可能更容易理解)。

答案 3 :(得分:0)

isContainsAll(s1, s2)

1。用“”分割s2; s.split(“”)
2。检查s1是否包含s2的所有元素

public static boolean isContainsAll(String s1, String s2){
        String[] split = s2.split(" ");

        for(int i=0; i<split.length; i++){
            if(!s1.contains(split[i])){
                return false;
            }
        }

        return true;
    }

    public static void main(String... args){
        System.out.println(isContainsAll("asd dsasda das asd; asds asd;/ ", "asd;/"));
    }

答案 4 :(得分:0)

虽然执行此操作的算法很简单,但如果要支持多个区域设置,则实现更复杂。下面是支持多个区域设置的示例代码。我用英文和中文证实了这一点(但我不确定它是否通过土耳其测试;-))。无论如何,下面的代码需要一些重构,但这会让你开始。

注意:即使您不希望支持除英语之外的其他语言,我仍然会使用下面的单词boundarie / punctuations / grammar等依赖于语言环境/语言,StringTokenizer,String可能无法很好地解决这个问题。拆分(...)和其他基本API。

import java.text.BreakIterator;
import java.text.Collator;
import java.util.Locale;
import java.util.Set;
import java.util.TreeSet;

import org.apache.commons.lang.StringEscapeUtils;

public class UnicodeWordCount
{

    public static void main(final String[] args)
    {
        testEnglish();
        testChinese();
    }

    public static void testEnglish()
    {
        BreakIterator wordIterator = BreakIterator.getWordInstance(Locale.ENGLISH);
        String str = "This is the source string";
        String match = "source string is this";
        String doesntMatch = "from Pangea";

        Set<String> uniqueWords = extractWords(str, wordIterator, Locale.ENGLISH);

        printWords(uniqueWords);

        System.out.println("Should print true: " + contains(match, wordIterator, uniqueWords));
        System.out.println("Should print false: " + contains(doesntMatch, wordIterator, uniqueWords));

    }

    public static void testChinese()
    {
        BreakIterator wordIterator = BreakIterator.getWordInstance(Locale.CHINESE);
        String str = "\u4E0D\u70BA\u6307\u800C\u8B02\u4E4B\u6307\uFF0C\u662F[\u7121\u90E8]\u70BA\u6307\u3002\u201D\u5176\u539F\u6587\u70BA";
        String match = "\u5176\u539F\u6587\u70BA\uFF0C\u70BA\u6307";
        String doesntMatch = "\u4E0D\u70BA\u6307\u800C\u8B02\u4E4B\u6307\uFF0C\u662F[\u517C\u4E0D]\u70BA\u6307\u3002";

        Set<String> uniqueWords = extractWords(str, wordIterator, Locale.CHINESE);

        printWords(uniqueWords);
        System.out.println("Should print true: " + contains(match, wordIterator, uniqueWords));
        System.out.println("Should print false: " + contains(doesntMatch, wordIterator, uniqueWords));
    }

    public static Set<String> extractWords(final String input, final BreakIterator wordIterator, final Locale desiredLocale)
    {
        Collator collator = Collator.getInstance(desiredLocale);
        collator.setStrength(Collator.PRIMARY);
        Set<String> uniqueWords = new TreeSet<String>(collator);
        wordIterator.setText(input);
        int start = wordIterator.first();
        int end = wordIterator.next();

        while (end != BreakIterator.DONE)
        {
            String word = input.substring(start, end);
            if (Character.isLetterOrDigit(word.charAt(0)))
            {
                uniqueWords.add(word);
            }
            start = end;
            end = wordIterator.next();
        }
        return uniqueWords;
    }

    public static boolean contains(final String target, final BreakIterator wordIterator, final Set<String> uniqueWords)
    {

        wordIterator.setText(target);
        int start = wordIterator.first();
        int end = wordIterator.next();

        while (end != BreakIterator.DONE)
        {
            String word = target.substring(start, end);
            if (Character.isLetterOrDigit(word.charAt(0)))
            {

                if (!uniqueWords.contains(word))
                {
                    return false;
                }
            }
            start = end;
            end = wordIterator.next();
        }
        return true;
    }

    private static void printWords(final Set<String> uniqueWords)
    {
        for (String word : uniqueWords)
        {
            System.out.println(StringEscapeUtils.escapeJava(word));
        }
    }
}