-3

我有一个问题,但我无法解决这个问题。

  public static  void main(String [] arg) {    
         String description = "This time only $FB is highest priority";
         List<String> list = new ArrayList<String>();
         list.add("$FB");
         list.add("$F");
         for(String s : list) {
           if(description.contains(s)) {
              System.out.println(s);
           } 
         }
}

我得到的输出是 $FB 和 $F 但这个虚拟字符串只包含列表中的一个字符串.. 有没有其他方法只能给出完全匹配?

4

4 回答 4

8

看起来您想查看是否包含某个单词。你可以这样做:

Set<String> words = new HashSet<String>(Arrays.asList(description.split(" ")));

...
words.contains(s)
...
于 2013-08-07T15:36:41.560 回答
8

您可以使用正则表达式来检查字符串是否包含单词:

if (description.matches(".*\\b"+Pattern.quote(s)+"\\b.*")) {
    ...
}

锚点\b匹配单词边界。

于 2013-08-07T15:38:34.927 回答
0

contains是企业级软件框架的一个有据可查且(希望)经过良好测试的方法,这(根据经验)通常意味着它工作正常。

在这种特殊情况下,该contains方法运行良好。您的初始字符串包含$FB,因此它还包含$F(如果您考虑一下, and FBand and $and Fand )。B

也许(我在做一个疯狂的猜测)而不是你试图找到最后一个找到的项目之后包含的内容。在这种情况下,不要使用contains,使用indexOf,保存值,然后从保存的值中搜索,然后继续。

根据请求进行编辑,这是此类代码的示例。请注意,我尚未对其进行测试,因此可能缺少一些检查:

     int currentIndex = 0;
     for(String s : list) {
       int foundIndex = description.indexOf(s, currentIndex);
       if(foundIndex >= 0) {
          System.out.println(s);
          currentIndex = foundIndex + 1;
       } 
     }
于 2013-08-07T15:37:04.693 回答
0

这是另一种解决方案,可能不是最好的或更有效的,但有效,并展示了这个库的强大功能。因此,您可以使用 lambdaj(在此处下载-网站)和 hamcrest(在此处下载-网站),这些库对于管理集合非常强大,以下代码非常简单并且可以完美运行:

import static ch.lambdaj.Lambda.having;
import static ch.lambdaj.Lambda.on;
import static ch.lambdaj.Lambda.select;
import static org.hamcrest.Matchers.stringContainsInOrder;

import java.util.Arrays;
import java.util.List;

public class StringContains_03{
        public static void main(String[] args) {
            List<String> source =  Arrays.asList("This time only $FB,$RUG is highest priority".split(" "));
            List<String> patterns = Arrays.asList("$FB","$F");

            boolean patternsExistsInSource = select(source, having(on(String.class), stringContainsInOrder(patterns))).size()>0;
            System.out.println(patternsExistsInSource);//shows: true
            System.out.println(select(source, having(on(String.class), stringContainsInOrder(patterns))));//shows the matches: [$FB,$RUG]
    }
}

请注意,只有通过这一行,您才能知道模式是否在另一行中。

 boolean patternsExistsInSource = select(source, having(on(String.class), stringContainsInOrder(patterns))).size()>0;

使用这个库,您可以在一行中解决您的问题。您必须在项目中添加:hamcrest-all-1.3.jarlambdaj-2.4.jar

注意:这将帮助您假设您可以替代您的代码。我希望这会有用。

(已编辑)现在也适用于“这次只有 $FB,$RUG 是最高优先级”的情况。

于 2013-08-07T20:11:11.090 回答