包含 () 匹配两个字符串的问题



考虑到我们有一个包含三个单词的String,例如,"kids story book"我们将每个单词添加到HashMap<String, Integer>中,而字符串部分包含单词,整数部分包含单词在字符串中的位置,即 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()使用的所有匹配。我手动检查,发现有更多的结果要返回,而它没有发生。

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

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

要解决第二个问题:您应该先将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

相关内容

  • 没有找到相关文章

最新更新