【问题标题】:Get Next key in Linkedhashmap in java在java中的Linkedhashmap中获取Next键
【发布时间】:2012-10-05 06:07:43
【问题描述】:

我正在创建动态tabs.generateTab() 方法来帮助设置标签是否显示。就像Property 被显示,Info 不被显示,等等。但我被困在某个点上。我想显示Property 标签。我是这样传递的:

String nextTab = getNextTab("Property");

然后它将检查getNextTab 方法是否Propertytrue。如果是false,则该方法必须返回下一个true 值。

public LinkedHashMap generateTab() {
    LinkedHashMap selectedTabs = new LinkedHashMap();
    selectedTabs.put("People", true);
    selectedTabs.put("Property", true);
    selectedTabs.put("Info", false);
    selectedTabs.put("Fixture", true);
    selectedTabs.put("Fee", true);
    selectedTabs.put("Process", true);
}

public String getNextTab(String currentTab) {

    String nextTab = null;
    Map<String, Boolean> tabList = generateTab();
    Iterator iterator = tabList.keySet().iterator();

    while (iterator.hasNext()) {
        Map.Entry entry = (Map.Entry) iterator.next();
        if (entry.getKey().equals(currentTab)) {
            if (tabList.get(entry.getKey()).equals(true)) {
                nextTab = entry.getKey().toString();
                break;
            }
        }
    }
    return nextTab;
}

你能帮我得到下一个我在其他部分签入的密钥吗?

【问题讨论】:

  • 你遇到了什么问题??代码应该可以工作或应该有问题..您需要给我们其中一个..(最好是第二个)
  • 我现在看到的代码返回同一个标签,因为找到当前标签后,你返回它。

标签: java iterator linkedhashmap


【解决方案1】:

您的代码似乎存在多个问题

1)public LinkedHashMap generateTab():理想情况下它应该返回一个 LinkedHashMap。 (我假设它是复制粘贴错误)

2)iterator.next() :这应该返回一个 ClassCastException 用于将 String 转换为 Map.Entry

3)要返回nextTab,您必须调用一次iterator.next() 将迭代器移动到下一项。

将您的 getNextTab() 函数更改为如下所示。

public static String getNextTab(String currentTab) {

    String nextTab = null;
    Map<String,Boolean> tabList = generateTab();
    Iterator iterator = tabList.keySet().iterator();

    while (iterator.hasNext() ){
        String entry =(String) iterator.next();

         if(entry.equals(currentTab))
         {
             if(tabList.get(entry).equals(true))
             {

                 nextTab = entry;
                 break;
             } 
             else
             {
                nextTab =(String) iterator.next();
                break;
             }

         }

     }
     return nextTab;
}

【讨论】:

    【解决方案2】:

    原始类型

    好的,这里的第一个问题是您使用了原始LinkedHashMap、原始Iterator 和原始Map.Entry。这将导致各种运行时错误,尤其是在您的代码中。如果您一开始就用&lt;&gt; 输入everything,编译器会给出错误,帮助您解决几个问题。

    首先,让我们更改LinkedHashMap 的输入:

    public LinkedHashMap<String, Boolean> generateTab() {
        LinkedHashMap<String, Boolean> selectedTabs = new LinkedHashMap<String, Boolean>();
        selectedTabs.put("People", true);
        selectedTabs.put("Property", true);
        selectedTabs.put("Info", false);
        selectedTabs.put("Fixture", true);
        selectedTabs.put("Fee", true);
        selectedTabs.put("Process", true);
        return selectedTabs;
    }
    

    接下来,我们将其添加到Iterator。从您的代码中,很明显您期望来自IteratorMap.Entry,所以让我们从它开始吧。

    Iterator<Map.Entry> iterator = tabList.keySet().iterator();
    

    当你在你的代码中输入这个时,你会得到一个错误:

    类型不匹配:无法从 Iterator&lt;String&gt; 转换为 Iterator&lt;Map.Entry&gt;

    这意味着您的迭代器没有像您想象的那样在Map.Entry 上键入。这是因为keySetLinkedHashMap 返回一个Set&lt;K&gt;,而不是像你想象的Set&lt;Entry&lt;K, V&gt;&gt;。你想要的是tabList.entrySet().iterator()。但是,如果你输入这个,它会告诉你:

    类型不匹配:无法从 Iterator&lt;Map.Entry&lt;String,Boolean&gt;&gt; 转换为 Iterator&lt;Map.Entry&gt;

    所以我们还必须将&lt;String, Boolean&gt; 添加到Map.Entry 中:

    Iterator<Map.Entry<String, Boolean>> iterator = tabList.entrySet().iterator();
    

    还有一些其他的小事。现在我们已经改变了这一点,我们可以 a) 用 getKey() 替换你的 getKey().toString() 调用(因为它现在是一个字符串)和 b)用 entry.getValue() 替换你的 tabList.get(entry.getKey()).equals(true) (因为它现在是一个布尔值) .

    现在我们已经解决了这个问题,您的代码将如下所示(在解决您的问题之前):

    public LinkedHashMap<String, Boolean> generateTab() {
        LinkedHashMap<String, Boolean> selectedTabs = new LinkedHashMap<String, Boolean>();
        selectedTabs.put("People", true);
        selectedTabs.put("Property", true);
        selectedTabs.put("Info", false);
        selectedTabs.put("Fixture", true);
        selectedTabs.put("Fee", true);
        selectedTabs.put("Process", true);
        return selectedTabs;
    }
    
    public String getNextTab(String currentTab) {
        String nextTab = null;
        Map<String, Boolean> tabList = generateTab();
        Iterator<Map.Entry<String, Boolean>> iterator = tabList.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, Boolean> entry = iterator.next();
            if (entry.getKey().equals(currentTab)) {
                if (entry.getValue()) {
                    nextTab = entry.getKey();
                    break;
                }
            }
        }
        return nextTab;
    }
    

    获取下一个标签

    所以如果我理解正确的话,你想找到当前标签,然后在地图中返回标签之后,对吗?

    编辑:我现在明白了,你想要下一个隐藏/显示值为true的。

    要做到这一点,你已经有了迭代器,所以你可以使用它。如果您在当前选项卡上:

    1. 检查迭代器中是否有剩余内容
    2. 如果有,获取迭代器中的下一个值(下一个选项卡)
    3. 如果没有,刷新迭代器获取第一个值(我们已经到了结尾,所以循环回到开头)
    4. 是否可见?如果是,则返回,否则,继续。

    这将返回当前选择的标签之后可见的第一个标签。如果选项卡仅可见选项卡是被选中的选项卡,这将再次返回该选项卡。如果没有可见的选项卡,请小心调用它。确保不会发生这种情况,因为如果所有选项卡都被隐藏,它将创建一个无限循环。

    这会将您的循环更改为如下所示:

    while (iterator.hasNext()) {
        Map.Entry<String, Boolean> entry = iterator.next();
        if (entry.getKey().equals(currentTab)) {
            if (entry.getValue()) {
                while (true) {
                    if (iterator.hasNext()) {
                        entry = iterator.next();
                    } else {
                        // Get a fresh iterator and get its first element
                        iterator = tabList.iterator();
                        entry = iterator.next();
                    }
                    if (entry.getValue()) {
                        return entry.getKey();
                    }
                }
            }
        }
    }
    

    你去吧!请注意,我必须使用return 而不是break,因为打破两个 循环需要a)boolean 变量在第二个循环退出后使第一个循环退出,或者b) 要中断的break 语句的标签,这两个都不是好的选择,真的。

    【讨论】:

      【解决方案3】:

      试试这个..

      for(Map.Entry<String,Boolean> arr : tabList.entrySet()){
      
           if(arr.getKey().equals("Property")){
      
      
                   if(arr.getValue()){
      
                       // Do something is Property is True
      
                  }else{
      
                       // Do something is Property is False
      
                  }
      
      
      }
      

      【讨论】:

      • 我当前的标签是属性。如果它是真的,它会给我属性标签。但如果它是假的,那么我想得到下一个标签,它是信息
      【解决方案4】:

      如果删除了不必要的逻辑,代码如下所示

      public String getNextTab(String currentTab) {
          Map<String, Boolean> tabList = generateTab();
          boolean shouldStart = false;
          for (Map.Entry<String, Boolean> value : tabList.entrySet()) {
              if (value.getKey().equals(currentTab)) {
                  shouldStart = true;//to check if we have found entry7
                  continue;
              }
              if (shouldStart) {
                  if (value.getValue().equals(true))
                      return value.getKey();//return the key which has next value true
              }
          }
          return null;
      }
      

      输出

      getNextTab("Property")-->Fixture
      

      【讨论】:

      • 我当前的标签是人物,如果它是真的,它会给我人物标签,但我想得到下一个键。它不是不必要的
      • @psisodia Logic 需要一些小修复,请查看答案。
      • 我不想要空值我只想要下一个 Tab 值。就像当我运行你的代码时我得到输出 - People Property null Fixture Fee Process 但根据我的说法,我的输出将是 People Property Fixture Fee Process如果它为空,它将给我下一个选项卡,即 Fixture。
      • @psisodia 是的,正如前面评论中所说,逻辑需要一些小修复,现在它可以正常工作了
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-10
      • 1970-01-01
      • 2021-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多