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