我正在创建动态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;
}
你能帮助我获得下一个我在其他地方检查过的钥匙吗?
答案 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;
}
的下一个。
要做到这一点,你已经有了迭代器,所以你可以使用它。如果您在当前标签上:
这将返回当前所选选项后可见的第一个选项卡。如果仅选项卡可见选项卡是选定的选项卡,则会再次返回该选项卡。如果没有可见的标签,请注意调用它。确保不会发生这种情况,因为如果所有选项卡都被隐藏,它将创建一个无限循环。
这会将你的循环改为:
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
}
}