![](/img/trans.png)
[英]How to remove the dulpicates from ArrayList<HashMap<String,Object>> in java?
[英]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
}
它可能類似於以下內容(將數組替換為列表以簡化使用):
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()
將刪除整個條目(鍵映射到作者列表)。 僅在列表為空時才需要刪除它,因此這是一個兩步過程:
您應該使用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.