如何从java中的段落中找到多组特定单词?

时间:2017-08-04 10:43:17

标签: java arrays string

说我有一个这样的段落:

String str = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s";

setA将包含Lorem,text,dummy等词 setB将包含像Ipsum,印刷,工业等词 setC将包含Lorem,text,dummy,Ipsum,printing,industry等字样。

之后

if(str.equals(set A))
{
  Some logic
}
else if{
  Set B logic
}
else{
 Set C logic
}

我如何在java中编码?

3 个答案:

答案 0 :(得分:1)

尝试以下内容:

public boolean hasAny( final String txt, final Collection<String> words )
{
   for ( final String word : words )
      if ( txt.contains( word ) )
         return true;
    return false;
}

public boolean hasAll( final String txt, final Collection<String> words )
{
   boolean result = true;
   for ( final String word : words )
     result &= txt.contains( word );
   return result;
}

也可以用Java8流完成类似的工作......

答案 1 :(得分:0)

您是否期望每个集合的整数返回告诉您幻影的数量,或者是一个布尔值,告诉您每个集合中是否有多个幻像?

我会计算字符串中每个单词的幻影数量并返回最低值,或者当每个幻影的数量>> 2时返回一个布尔值,具体取决于你想要做什么。

我们首先要有一个类型

的结构
var groups = datatable.AsEnumerable().GroupBy(item => item.Date.Date);

伪代码:

Map<Integer,String> setA = new HashMap<Integer,String>();// Integer is the number of apparitions of the String in the set

如果这是您想要的,请告诉我,然后我会为您提供代码。

答案 2 :(得分:0)

也许这是一个奇怪的解决方案,但它可以在很长的段落中帮助你,所以通常我会使用String::matches和一些正则表达式:

//Only one word
(?i)(?=.*\bword\b).*
//-----------^

//Multiple words
(?i)(?=.*\bword1\b).*(?=.*\bword2\b).*
//---------^-----------------^

所以这个想法很简单,为你的单词创建一个模式,然后使用匹配来验证段落是否包含所有单词:

代码示例:

class Main {

    public static void main(String as[]) {
        String str = "Lorem Ipsum is simply dummy text of the printing and "
            + "typesetting industry. Lorem Ipsum has been the industry's "
            + "standard dummy text ever since the 1500s";

        String setA = "Lorem, text, dummy";
        String setB = "Ipsum, printing, industry";
        String setC = "Lorem, text, dummy,Ipsum, printing, industry";
        Main m = new Main();

        if (str.matches(m.getPattern(setA))) {
            //Do something
        } else if (str.matches(m.getPattern(setB))) {
            //Do something
        } else if (str.matches(m.getPattern(setC))) {
            //Do something
        }

    }

   //The important method
   private String getPattern(String words) {
       StringBuilder pattern = new StringBuilder();
       System.out.println(Arrays.toString(words.split(",\\s*")));
       Arrays.asList(words.split(",\\s*"))
               .stream()
               .map(t -> "(?=.*\\b" + t + "\\b).*")
               .forEach(pattern::append);
       return "(?i)" + pattern.toString();
   }
}

方法getPattern将采用单词setAsetBsetC ...的列表,它可以是任何内容,然后在:

  1. (1)将这些单词拆分为例如setA它会给你[Lorem, text, dummy](我认为输入是一个字符串,我使用拆分,如果你有一个集合,你可以避免使用拆分并使用此像这样的集合)
  2. (2)循环抛出单词列表以创建模式,稍后可以使用它来匹配您的输入(我使用Java 8流而不是普通循环来简化模式的创建)。
  3. 例如:对于setA,它会返回一个类似(?i)(?=.*\bLorem\b).*(?=.*\btext\b).*(?=.*\bdummy\b).*的模式,它可以匹配包含所有单词 Lorem和{的任何paragraphe {1}}和虚拟

    检查regex demo