簡體   English   中英

Java TreeSet 基於 object 屬性刪除重復項

[英]Java TreeSet remove duplicates based on object attribute

我希望使用TreeSet根據屬性刪除重復的 object (這里是返回對象名稱的toString() ),這是我的代碼:

Set<Object> s = new TreeSet<>(new Comparator<Object>() {          
            @Override
            public int compare(Object o1, Object o2) {
                if (o1.toString().equals(o2.toString())) {
                    return 0;
                } else {
                    return 1;
                }
            }
        });
s.addAll(listComCopy);
listComCopy.clear();
listComCopy.addAll(s);

listComCopy是 object 的列表。

它可以工作,但它只比較列表中的連續對象,所以如果我有list(50).equals(list(150))它將忽略。

您是否知道如何重構此代碼以消除所有重復項,無論它們在列表中的順序如何?

根據TreeSet的構造函數javadoc

TreeSet(比較器比較器)
構造一個新的空樹集, 樹集根據指定的比較器進行排序

您提供的比較器僅用於排序,而不用於重復刪除。

如果要刪除重復項,則應在要存儲在此TreeSet上的對象類上實現.equals().hashcode() ,因此在向其中添加新元素時,重復項刪除邏輯將立即可用。

您的compare方法不符合要求。

請參閱Comparator.compare ...

比較其兩個參數的順序。 當第一個參數小於 ,等於或大於第二個參數時,返回負整數 ,零或正整數。

您最好在compare使用String.compareTo

    Set<Object> s = new TreeSet<>(new Comparator<Object>() {
        @Override
        public int compare(Object o1, Object o2) {
            return o1.toString().compareTo(o2.toString());
        }
    });

您可能想使用compareTo方法而不是equals方法來比較字符串。 這將允許樹集構建實際的樹狀結構。

您應該重新考慮Comparator實現。 java.util.Comparator#compare javadoc:

@返回負整數,零或正整數,因為第一個參數小於,等於或大於第二個參數。

您永遠不會在代碼中返回負數,請考慮return o1.toString().compareTo(o2.toString())作為您的Comparator實現

TreeSet 似乎沒有在元素 class 上使用 equals 和 hashCode ,因為 HashSet 用於其重復刪除。 相反,它使用排序列表來消除重復項。 為了獲得預期的效果(重復刪除),應該確保完美地執行比較器的比較。 在這種情況下,將 "if (o1.toString().equals(o2.toString())) { return 0; } else { return 1; }" 替換為 "o1.toString().compareTo(o2.toString() )" 應該解決問題。

暫無
暫無

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

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