考虑到我们有 String
包含三个单词,例如 "kids story book"
我们将这些单词添加到 HashMap<String, Integer>
中而字符串部分包含单词,整数部分包含单词在字符串中的位置,即 1、2 和 3。还假设还有另一个相同类型的 HashMap
这是由一系列分组的单词组成的字段。考虑每组单词都有一个共同的整数值作为 ID,表明它们属于同一组。我的目标是研究第二个 HashMap
为了找到包含 kids
的任何字符串, story
或book
然后返回该单词及其唯一的整数 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()){
....
关于java - contains() 匹配两个字符串的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33460031/