在java中的Linkedhashmap中获取Next键

时间:2012-10-05 06:07:43

标签: java iterator linkedhashmap

我正在创建动态tabs.generateTab()方法帮助,以设置要显示的标签。与显示Property一样,Info不显示等等。但我在某些方面陷入困境。我想显示Property标签。我这样传递它:

String nextTab = getNextTab("Property");

然后,如果getNextTabProperty,则会检入true方法。如果是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;
}
你能帮助我获得下一个我在其他地方检查过的钥匙吗?

4 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

原始类型

好的,这里的第一个问题是您使用原始LinkedHashMap,原始Iterator和原始Map.Entry。这将导致所有类型的运行时错误,尤其是在您的代码中。如果您已经开始使用<>键入所有内容,则编译器会给您一些错误,这些错误可以帮助您解决一些问题。

首先,让我们改变要输入的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。从您的代码中可以看出,您希望Map.Entry中有Iterator,所以让我们从那开始。

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

当您在代码中输入此代码时,您将收到错误:

  

类型不匹配:无法从Iterator<String>转换为Iterator<Map.Entry>

这意味着您的迭代器在Map.Entry上的类型,就像您认为的那样。这是因为keySet会从Set<K>返回LinkedHashMap,而不会像您想象的那样Set<Entry<K, V>>。你想要的是tabList.entrySet().iterator()。但是,如果您输入此内容,它会告诉您:

  

类型不匹配:无法从Iterator<Map.Entry<String,Boolean>>转换为Iterator<Map.Entry>

因此我们必须将<String, Boolean>添加到Map.Entry

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

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

现在,我们已经对此进行了排序,您的代码将如下所示(在解决您的问题之前):

entry.getValue()

获取下一个标签

因此,如果我理解正确,您想要找到当前标签,然后在地图中之后返回选项卡,是否正确?

编辑:我现在看到,您想要隐藏/显示值为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; } 的下一个。

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

  1. 检查迭代器中是否还有其他内容
  2. 如果有,请在迭代器中获取下一个值(下一个选项卡,实际上)
  3. 如果没有,刷新迭代器得到第一个值(我们已经到了最后,所以循环回到开头)
  4. 可见吗?如果是,请将其退回,否则,继续。
  5. 这将返回当前所选选项后可见的第一个选项卡。如果仅选项卡可见选项卡是选定的选项卡,则会再次返回该选项卡。如果没有可见的标签,请注意调用它。确保不会发生这种情况,因为如果所有选项卡都被隐藏,它将创建一个无限循环。

    这会将你的循环改为:

    true

    你去吧!请注意,我必须使用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,因为突破两个循环需要a)break变量才能使第一个循环退出第二个退出,或者b)boolean语句的标签要打破,这两个都不是好的选择。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

试试这个..

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

            }


}