使用contains()来匹配两个字符串

时间:2015-11-01 07:11:58

标签: java string contains stringtokenizer

考虑到我们有String包含三个单词,例如,"kids story book"我们将这些单词添加到HashMap<String, Integer>中,而String部分包含单词,整数部分包含字符串中单词的位置,即1,2和3.还假设存在另一种相同类型的HashMap,它是由严重的分组字组成的字段。考虑每组单词具有共同的整数值作为ID,表明它们属于一起。我的目的是查看第二个HashMap,以查找包含kidsstorybook之一的任何字符串,然后将该字与其唯一整数一起返回ID。这是我的代码:

       String keyword="kids story book";
       static HashMap<String, Integer> tempp = new HashMap<>();
       static HashMap<String, Integer> stringToint = new HashMap<>();

                 //File is .txt file which contains some characters at each line
                 FileOutputStream Fcategorize=new FileOutputStream(File,true);

          FileReader inputFile = new FileReader(File);

          BufferedReader bufferReader = new BufferedReader(inputFile);

String line = bufferReader.readLine();


        for(int i = 0; line != null; i++){
        if( header(i).equals(line)){
            while( (line = bufferReader.readLine()) != null && ! Footer(i).equals( line ) )
               {


stringToint.put(line, i);
 }
              }

        }



    StringTokenizer start=new StringTokenizer(keyword);

    for(int i=-1; i<=start.countTokens();i++)
    {
        String temp=start.nextToken();
        tempp.put(temp, i);
    }

    Set<String> fkeys = stringToint.keySet();
    Iterator<String> fit = fkeys.iterator();


    Set<String> Lkeys =tempp.keySet();
    Iterator<String> sit = Lkeys.iterator();


    for(int i=0 ; i<tempp.size() ; i++)
    {
    nextToken=sit.next();
    while (fit.hasNext()){
                    String featurename = fit.next();

               if(featurename.contains(nextToken))
               {

              //Do something
               }

           }

    }

有三个问题:首先,第一个HashMap确实包含所有三个单词,但是如果我使用控制台打印结果,它只打印第一个HashMap项的匹配而不是所有这三个(所有三个单词都有其他匹配)。其次,正如在代码中显而易见的那样,我从i=-1启动了循环,这是因为如果我使用i=0,则不会将所有三个字符添加到HashMap并且在此在这种情况下,字符串中单词的顺序与HashMap中单词的顺序不一致,最后,即使对于HashMap的第一个位置的项目,它甚至不会返回所有匹配,由contains()使用。我手动检查了一下,发现有更多的结果要在没有发生的情况下返回。

2 个答案:

答案 0 :(得分:1)

第三个问题是你没有在每个单词搜索上重置fit迭代器(在你的代码中,重置意味着初始化一个新单词)。 实际上,每次在for循环

中进行初始化时都需要进行初始化
for(int i=0 ; i<tempp.size() ; i++)
{
    nextToken=sit.next();
    fit = fkeys.iterator();
    while (fit.hasNext()){
         ....

答案 1 :(得分:1)

解决第二个问题:你应该存储start.countTokens()的值;首先进入另一个变量,而不是在每个循环中进行评估。因为每次调用start.nextToken()时,start.countTokens()都会减1。

修改:您可以使用 LinkedHashMap 来按照添加到地图的方式维护条目的顺序。

HashMap<String, Integer> tempp = new LinkedHashMap<>(); // use LinkedHashMap to maintain order

    String keyword = "kids story book";
    StringTokenizer start = new StringTokenizer(keyword);
    int count = start.countTokens(); // save it to another variable

    for (int i = 0; i < count; i++) {
        String temp = start.nextToken();
        tempp.put(temp, i);
    }

    for (Map.Entry entry : tempp.entrySet()) {
        System.out.println(entry.getKey() + ", " + entry.getValue());
    }
    // gives you
    // kids, 0
    // story, 1
    // book, 2