[英]Get Next key in Linkedhashmap in java
我正在創建動態tabs.generateTab()
方法幫助設置要顯示或不顯示的選項卡。 喜歡要顯示的Property
, Info
不顯示等等。但我在某些方面陷入困境。 我想顯示Property
選項卡。 我這樣傳遞:
String nextTab = getNextTab("Property");
然后,如果Property
為true
,它將檢查getNextTab
方法。 如果為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;
}
你可以幫我拿下我在其他地方檢查的下一把鑰匙嗎?
您的代碼似乎存在多個問題
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;
}
原始類型
好的,這里的第一個問題是您使用原始的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
。 從您的代碼中可以清楚地看到,您正在期待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();
還有其他幾件小事。 現在,我們已經改變了這一點,我們就可以一)取代您的getKey().toString()
只調用getKey()
因為它是一個字符串現在)和b)更換您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
而不是break
,因為斷開兩個循環需要a)一個boolean
變量使第一個循環在第二個循環退出后退出,或者b)一個標簽讓break
語句斷開,其中很好的選擇,真的。
如果刪除了不必要的邏輯,代碼如下所示
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
嘗試這個..
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
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.