原始类型
好的,这里的第一个问题是您使用了原始LinkedHashMap、原始Iterator 和原始Map.Entry。这将导致各种运行时错误,尤其是在您的代码中。如果您一开始就用<> 输入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。从您的代码中,很明显您期望来自Iterator 的Map.Entry,所以让我们从它开始吧。
Iterator<Map.Entry> iterator = tabList.keySet().iterator();
当你在你的代码中输入这个时,你会得到一个错误:
类型不匹配:无法从 Iterator<String> 转换为 Iterator<Map.Entry>
这意味着您的迭代器没有像您想象的那样在Map.Entry 上键入。这是因为keySet 从LinkedHashMap 返回一个Set<K>,而不是像你想象的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() 替换你的 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的。
要做到这一点,你已经有了迭代器,所以你可以使用它。如果您在当前选项卡上:
- 检查迭代器中是否有剩余内容
- 如果有,获取迭代器中的下一个值(下一个选项卡)
- 如果没有,刷新迭代器获取第一个值(我们已经到了结尾,所以循环回到开头)
- 是否可见?如果是,则返回,否则,继续。
这将返回当前选择的标签之后可见的第一个标签。如果选项卡仅可见选项卡是被选中的选项卡,这将再次返回该选项卡。如果没有可见的选项卡,请小心调用它。确保不会发生这种情况,因为如果所有选项卡都被隐藏,它将创建一个无限循环。
这会将您的循环更改为如下所示:
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 语句的标签,这两个都不是好的选择,真的。