0

我正在创建动态tabs.generateTab()方法帮助来设置要显示或不显示的选项卡。喜欢Property被展示,Info不被展示,等等。但我被困在某个点上。我想显示Property标签。我这样传递它:

String nextTab = getNextTab("Property");

然后它将检查getNextTab方法是否Property存在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

4 回答 4

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;
}
于 2012-10-05T06:11:38.813 回答
1

原始类型

好的,您的第一个问题是您使用 raw LinkedHashMap、 rawIterator和 raw 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. 从您的代码中,很明显您期望 aMap.Entry来自Iterator,所以让我们从它开始。

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

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

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

这意味着您的迭代器没有Map.Entry像您想象的那样输入。这是因为从 中keySet返回 a ,不像你想象的那样。你想要的是. 但是,如果你输入这个,它会告诉你:Set<K>LinkedHashMapSet<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()用 just 替换你的调用getKey()(因为它现在是一个字符串)和 b)用tabList.get(entry.getKey()).equals(true)just替换你的调用(因为它现在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;
}

获取下一个选项卡

因此,如果我理解正确,您想找到当前选项卡,然后在地图中返回该选项卡对吗?

编辑:我现在看到,您想要下一个隐藏/显示值为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中断的语句的标签,这两者都不是好的选项,真的。

于 2012-10-05T06:31:48.620 回答
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
于 2012-10-05T06:18:23.737 回答
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

            }


}
于 2012-10-05T06:18:25.910 回答