簡體   English   中英

在java中的Linkedhashmap中獲取Next鍵

[英]Get Next key in Linkedhashmap in java

我正在創建動態tabs.generateTab()方法幫助設置要顯示或不顯示的選項卡。 喜歡要顯示的PropertyInfo不顯示等等。但我在某些方面陷入困境。 我想顯示Property選項卡。 我這樣傳遞:

String nextTab = getNextTab("Property");

然后,如果Propertytrue ,它將檢查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 從您的代碼中可以清楚地看到,您正在期待IteratorMap.Entry ,所以讓我們從這開始。

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

當您在代碼中輸入此代碼時,您將收到錯誤:

類型不匹配:無法從Iterator<String>轉換為Iterator<Map.Entry>

這意味着你的迭代器沒有像你想象的那樣在Map.Entry輸入。 這是因為keySetLinkedHashMap返回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下一個。

要做到這一點,你已經有了迭代器,所以你可以使用它。 如果您在當前標簽上:

  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語句斷開,其中很好的選擇,真的。

如果刪除了不必要的邏輯,代碼如下所示

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM