簡體   English   中英

在java中使用TreeSet的替代方法?

[英]Alternative to using TreeSet in java?

我正在尋找一個將使用給定比較器刪除All()的Set類。

我正在使用TreeSet,但幾個小時后我的頭發試圖弄清楚為什么我的removeAll()沒有刪除任何我發現這...

http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4730113

長話短說removeAll()使用equals()方法。 (但奇怪的是remove()方法不...)

我確實需要一個Set,其中重復刪除,最好是使用比較器,但不是必需的,我不能覆蓋equals方法b / c我需要它作為其他邏輯。 顯然我想避免在所有元素上創建一個調用remove()的循環,這樣它就不會在將來(或其他人)混淆我。

這樣的動物動物存在嗎?

TreeSet.removeAll方法接受Collection<?>作為參數。 集合中的對象可以是任何類型,不一定是Comparable對象。 您需要使用不同的方法創建自己的Set。 請注意,錯誤解決方案是“無法修復”

這種行為實際上非常合理。 'equals'確定兩個對象是否具有相同的標識,compare比較確定了與它們對應的某種形式的大小之間的關系。

兩個對象可以絕對不同(等於返回false)但仍然具有相同的大小(例如,考慮復數)。

您的期望是removeAll將根據對象的“大小”(由比較定義)確定需要刪除的內容,您看到的刪除實際上是根據身份進行的。

簡而言之,使用循環:-)

你可以用

public static <T> void removeAll(TreeSet<T> set, Collection<T> toRemove)
{
  TreeSet<T> toRemoveTreeSet=new TreeSet<>(set.comparator());
  toRemoveTreeSet.addAll(toRemove);
  set.removeAll(toRemoveTreeSet);
}

要么

public static <T> void removeAll(TreeSet<T> set, Collection<?> toRemove)
{
  for(Object o:toRemove) set.remove(o);
}

您是否重寫了TreeSet包含的對象的equals和hashcode方法?

暫無
暫無

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

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