亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 Java 集進行重復數據刪除

使用 Java 集進行重復數據刪除

慕少森 2021-09-15 10:46:14
我有一組對象,讓我們稱它們為 A、B、C、D...,其中一些與其他對象相同。如果 A 和 C 相等,那么我想用對 A 的引用替換對 C 的每個引用。這意味著 (a) 對象 C 可以被垃圾收集,釋放內存,以及 (b) 我以后可以使用“==”比較對象而不是昂貴的equals()操作。(這些對象很大,equals()操作很慢。)我的直覺是使用java.util.Set. 當我遇到 CI 時可以很容易地看到是否有Set等于 C的條目。但如果有,似乎沒有簡單的方法可以找出該條目是什么,并替換我對現有條目的引用。我錯了嗎?遍歷所有條目以找到匹配的條目顯然是不可能的。目前,Set我使用的不是 a ,而是 a ,Map其中的值始終與鍵相同。調用map.get(C)然后找到 A。這有效,但感覺非常復雜。有沒有更優雅的方式來做到這一點?
查看完整描述

1 回答

?
偶然的你

TA貢獻1841條經驗 獲得超3個贊

這個問題不是簡單的重復數據刪除:它是一種規范化形式。


標準方法是使用 aMap而不是 a Set。這是如何做到這一點的草圖:


public <T> List<T> canonicalizeList(List<T> input) {

    HashMap<T, T> map = new HashMap<>();

    List<T> output = new ArrayList<>();

    for (T element: input) {

        T canonical = map.get(element);

        if (canonical == null) {

            element = canonical;

            map.put(canonical, canonical);

        }

        output.add(canonical);

    }

    return output;

}

請注意,這是O(N). 如果你可以安全地假設,在重復的比例input很可能是小的,那么你可以設置的能力map,并output以規模input。


現在你似乎在說你已經在這樣做了(最后一段),你在問是否有更好的方法。據我所知,沒有。(HashSetAPI 讓您可以測試一個集合是否包含等于 的值element,但它不會讓您找出它在 中的內容O(1)。)


就其價值而言,HashSet<T>該類在底層實現為HashMap<T, T>. 因此,您不會通過HashSet直接使用...


查看完整回答
反對 回復 2021-09-15
  • 1 回答
  • 0 關注
  • 208 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號