Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
链接哈希映射-迭代(Java)_Java_Linkedhashmap - Fatal编程技术网

链接哈希映射-迭代(Java)

链接哈希映射-迭代(Java),java,linkedhashmap,Java,Linkedhashmap,我试图遍历一个链接的HashMap键集,但是我很难让它正常工作 本质上,我是在搜索键集以查找一个单词和另一个单词。如果第二个单词紧跟在第一个单词之后,我希望返回true。这就是我迄今所取得的进展 for (String word : storedWords.keySet()) { value0++; if(word.equals(firstWord)){ value1 = value0; } if(wo

我试图遍历一个链接的HashMap键集,但是我很难让它正常工作

本质上,我是在搜索键集以查找一个单词和另一个单词。如果第二个单词紧跟在第一个单词之后,我希望返回true。这就是我迄今所取得的进展

for (String word : storedWords.keySet()) {

        value0++;

        if(word.equals(firstWord)){
            value1 = value0;
        }

        if(word.equals(secondWord)){
            value2 = value0;
        }

        int value3 = value2 - 1;
        if(value1 == value3){
            result = true;
            break;
        }
    }
编辑:

我已经解决了我的问题,感谢所有帮助过我的人。我很抱歉在网站上有很多信息的时候发了一篇帖子,但是我只是不理解它背后的逻辑。

Map=。。。
Map<String, String> map = ...
for (Map.Entry<String, String> entry : map.entrySet()) {
    System.out.println(entry.getKey() + "/" + entry.getValue());
}
对于(Map.Entry:Map.entrySet()){ System.out.println(entry.getKey()+“/”+entry.getValue()); }
通过将每个元素的索引存储在单独的映射中,可以避免对整个
键集进行迭代;然后,您可以测试这两个键是否都存在,并且索引是否相差1。为方便起见,请将两个贴图封装到一个对象中:

import java.util.*;
公共类索引{
私有最终映射=新LinkedHashMap();
私有最终映射索引=新HashMap();
公共V get(K){
返回map.get(k);
}
公共V-put(K,V-V){
V old=map.put(k,V);
if(old==null){
index.put(k,index.size());
}
返老还童;
}
公共布尔区域邻接(kk1,kk2){
整数i1=索引.get(k1);
整数i2=索引.get(k2);
返回i1!=null&&i2!=null&&i1+1==i2;
}
}

您可以通过将
Map
方法委派给
Map
来添加更多
Map
方法(例如
size
)。但是,
remove
方法无法有效实现,因为它需要重新计算所有后续索引。如果需要从地图中删除,则应考虑替代数据结构设计;例如,
索引
可以存储每个键的原始插入顺序,并且可以使用a来计算有多少现有键具有较低的原始插入顺序。

我认为这在某种程度上与您开始使用的方法一致。不过,您可能需要测试性能

import java.util.LinkedHashMap;
import java.util.Map;

class Testing {
  Map<String, Integer> storedWords = new LinkedHashMap<>();
  {
    storedWords.put("One",1);
    storedWords.put("Two",2);
    storedWords.put("Three",3);
    storedWords.put("Four",4);
    storedWords.put("Five",5);
  }

  public static void main(String[] args) {
    Testing t = new Testing();
    String firstWord;
    String secondWord;

    firstWord = "Three";
    secondWord = "Five";
    System.out.println(t.consecutive(firstWord, secondWord)); // false

    firstWord = "Two";
    secondWord = "Three";
    System.out.println(t.consecutive(firstWord, secondWord)); // true
  }

  public boolean consecutive(String firstWord, String secondWord) {
    boolean foundfirst = false;  
    for (String word : storedWords.keySet()) {
      if (!foundfirst && word.equals(firstWord)){
        foundfirst = true;
        continue;
      }

      if (foundfirst) {
        if(word.equals(secondWord)){
          return true;
        } else {
          foundfirst = false; // reset to search for the first word again
        }
      }
    }
    return false;
  }
}
import java.util.LinkedHashMap;
导入java.util.Map;
类测试{
Map storedWords=新建LinkedHashMap();
{
储存字数。放入(“一”,1);
两个字,两个字;
三个字,三个字;
四个字,四个字;
储存字数。放入(“五”,5);
}
公共静态void main(字符串[]args){
测试t=新测试();
字符串第一个字;
字符串第二个字;
firstWord=“三”;
secondWord=“五”;
System.out.println(t.连续(第一个字,第二个字));//false
firstWord=“两个”;
secondWord=“三”;
System.out.println(t.连续(第一个字,第二个字));//true
}
公共布尔连续(字符串第一个字,字符串第二个字){
布尔值foundfirst=false;
for(字符串字:storedWords.keySet()){
如果(!foundfirst&&word.equals(firstWord)){
foundfirst=true;
继续;
}
如果(第一个){
if(字等于(第二个字)){
返回true;
}否则{
foundfirst=false;//重置以再次搜索第一个单词
}
}
}
返回false;
}
}

这是否回答了您的问题@谢谢你,我试过这个方法,但运气不好,所以我决定做一个线程,因为我正在努力理解它。我将使用此线程重试并报告。谢谢您的时间。您已经遍历了地图的密钥集。您在这里的实际意图是什么?具体来说,什么不起作用?使用(双重)链表而不是索引如何?这将支持删除,而且相当简单。诚然,由于LinkedHashMap已经使用了一个轮子,它将重新发明轮子,然后将它连接到您现有的轮子上。遗憾的是,LinkedHashMap没有提供一种获取键并返回该键处的迭代器的方法……是的,您可以滚动自己的链接列表并将链接列表节点放入hashmap,基本上实现自己版本的LinkedHashMap,并具有额外的行为,即能够判断两个节点是否相邻。当然,这是一个选项,是的。您好@kaya3,谢谢您为我编写解决方案。我也从你的帖子中学到了很多,我现在注意到我创建了很多不需要的变量,当你使用不同的逻辑达到同样的效果时。谢天谢地,我不需要删除任何东西,但我肯定会考虑到,如果我要实现该功能,这种方法将不起作用。再次感谢您抽出时间向我提供此信息。您好@Scratte,非常感谢您抽出时间提供此信息。当你无法想出正确的逻辑来编写一个问题时,这真是令人沮丧。谢谢你给我一个解决方案,不客气。我认为这是一个有趣的练习。我看了kaya3的另一个解决方案,但实际上我没有尝试。看起来它会表现得更好。不过,您需要保留两个列表。不鼓励只使用代码的答案,请添加一些上下文来解释此答案将如何解决问题。您的答案仅显示如何遍历集合。它没有回答所问的问题:如果迭代器在
第一个词之后点击
第二个词
,如何停止。