原始类型
好的,您的第一个问题是您使用 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>
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()
用 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
.
为此,您已经有了迭代器,因此您可以使用它。如果您在当前选项卡上:
- 检查迭代器中是否还有东西
- 如果有,则在迭代器中获取下一个值(下一个选项卡)
- 如果没有,刷新迭代器获取第一个值(我们已经到了结尾,所以循环回到开头)
- 是可见的吗?如果是,则返回,否则,继续。
这将返回在当前选定的选项卡之后可见的第一个选项卡。如果选项卡仅可见选项卡是被选中的选项卡,这将再次返回该选项卡。如果没有可见的选项卡,请小心调用它。确保这不会发生,因为如果所有选项卡都被隐藏,它将创建一个无限循环。
这会将您的循环更改为如下所示:
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
中断的语句的标签,这两者都不是好的选项,真的。