簡體   English   中英

如何從Java的哈希圖中刪除String數組值?

[英]How to remove an String array value from within a hashmap in java?

我有一個1993年至2009年諾貝爾獎獲得者的哈希圖,關鍵是年份,值是獲獎者姓名的字符串數組。 某些年份的獲勝者不止一個,而沒有年份的年份不超過3。我正在嘗試一種從哈希圖中刪除特定名稱並刪除密鑰的方法,前提是該特定年份只有一位獲勝者。 當我嘗試這種方法時,它將刪除整個鍵和值,無論該年是否有多個獲勝者。 (例如,1993年的獲獎者是納爾遜·曼德拉和弗雷德里克·威廉·德·克萊克,如果我嘗試只刪除納爾遜·曼德拉,那么1993年的全部作品都消失了)

public void removeWinner(String nameOfWinnerToRemove)

    {Iterator <HashMap.Entry<Integer, String[]>> it = winners.entrySet().iterator();
    while(it.hasNext())
    {
        HashMap.Entry<Integer, String[]> entry = it.next();
        for(int i = 0; i < entry.getValue().length; i++)

        {
            if(entry.getValue()[i].equalsIgnoreCase(nameOfWinnerToRemove))
            {
                it.remove();


            }
        }
    }

}

您正在執行it.remove(); 它將從HashMap中刪除整個條目(鍵值對),而不是從值中刪除特定的獲勝者。

您應該執行以下操作:

if(entry.getValue()[i].equalsIgnoreCase(nameOfWinnerToRemove))
    {
        /* Prepare a new value string without the name you want to remove */
        it.put(/* Key */, /* New Value */); //Doing this will overwrite the entry so you don't have to remove and re-add
    }
  1. 創建一系列新的不匹配贏家
  2. 將新數組設置為新值
  3. 如果數組只有一個元素,則刪除鍵值對。

它可能類似於以下內容(將數組替換為列表以簡化使用):

public void removeWinner(String nameOfWinnerToRemove) {
    final Map<String, List<String>> winnerMapping = new HashMap<>();
    final Iterator<Map.Entry<String, List<String>>> iterator = winnerMapping.entrySet().iterator();

    while (iterator.hasNext()) {
        final List<String> winners = iterator.next().getValue();
        final List<String> matchingWinners = new ArrayList<>();

        for (final String winner : winners) {
            if (winner.equalsIgnoreCase(nameOfWinnerToRemove)) {
                matchingWinners.add(winner);
            }
        }

        winners.removeAll(matchingWinners);

        if (winners.size() == 1) {
            iterator.remove();
        }
    }
}

簡單使用這個

myMap.get(yourKey).remove(yourValue);

更清晰 :

如果值是字符串List ,這將起作用

 winners.get(entry.getKey()).remove(nameOfWinnerToRemove);

如果值是array

 ArrayUtils.removeElement(winners.get(entry.getKey()), nameOfWinnerToRemove); 

這個it.remove(); 將刪除整個鍵值對

更新:

下載並導入org.apache.commons.lang3

要下載Jar,請訪問: http : //www.java2s.com/Code/Jar/c/Downloadcommonlang3jar.htm

您的變量“ it”指向每個包含年份鍵和名稱列表的地圖條目。 如果調用它。remove(),則將刪除整個地圖條目。 如果在數組中找到名稱,應該怎么做取決於列表中有多少個名稱。 如果有一個名字,那么調用它是正確的。remove()會刪除所有內容。 否則,我們希望使用地圖條目的值來保存沒有該名稱的新數組。

您的代碼應類似於以下內容:

public void removeWinner(String nameOfWinnerToRemove) {
    Iterator <HashMap.Entry<Integer, String[]>> it = winners.entrySet().iterator();
    while(it.hasNext()) {
        HashMap.Entry<Integer, String[]> entry = it.next();
        List<String> namesList = new ArrayList<String>(Arrays.asList(entry.getValue()));

        // Enter here if found and removed name
        if(namesList.remove(nameOfWinnerToRemove)) {
            if(namesList.size() > 0) {
                // Set array without name
                entry.setValue(namesList.toArray(entry.getValue());
            } else {
                // New list is empty.  Remove entry.
                it.remove();
            }
        }
    }
}

作為一般規則,如果您發現自己不得不經常添加或刪除對象,我建議您使用列表或集合而不是數組,這僅僅是因為從舊的數組創建新數組仍然需要轉換為列表,所以您d優化這些步驟。

it是地圖條目迭代器,因此it.remove()將刪除整個條目(鍵映射到作者列表)。 僅在列表為空時才需要刪除它,因此這是一個兩步過程:

  1. 確定是否需要刪除獲勝者,如果匹配則將其刪除
  2. 每當您從列表中刪除優勝者時,請檢查是否還需要刪除整個條目

您應該使用List<String>作為獲獎者列表,而不是String[] ,因為它更易於操作。

然后,您可以使用這種方法:

public void removeWinner(String nameOfWinnerToRemove) {

    Iterator <HashMap.Entry<Integer, String[]>> it = winners.entrySet().iterator();
    while(it.hasNext()) {
        HashMap.Entry<Integer, String[]> entry = it.next();
        Iterator<String> listIt = entry.getValue().iterator();
        while (listIt.hasNext()) {
            String value = listIt.next();
            if(value.equalsIgnoreCase(nameOfWinnerToRemove)) {
                listIt.remove(); // remove the winner

            }
        }

        if (entry.getValue().isEmpty()) {
            it.remove(); // remove whole entry if empty
        }
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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