1

Arrayサードパーティのライブラリを使用しているため、ライブラリから1つのメソッドを呼び出して配列を取得しているため、オブジェクトがあり、クラスにアクセスできませんMyObject

//I have no access to MyObject class, I am sure the objects contain duplicated elements.
MyObject[] objects = SOME_LIB_CLASS.getObjects(); 
System.out.println("length is "+ objects.length); //length is 6

オブジェクト内の重複した要素を削除しようとしましたが、次を使用しますSet:

Set<MyObject>  objectSet = new HashSet<MyObject>(Arrays.asList(objects));
System.out.println("length is "+ objectSet.size()); //length is 6 still

しかし、objectSetまだ重複した要素が含まれています。配列を反復せずに問題を解決する理由と方法は?

4

4 に答える 4

3

セットにまだ「重複」要素が含まれている場合、オブジェクトの equals メソッドは期待どおりの動作をしません。

a の重複はHashSet、実装によって決定されequalsます。

の実装を変更できない場合MyObject.equals()(ソース コードがないため - これはライブラリ クラスです)、 を使用しTreeSetて特別なコンパレータを提供することをお勧めします。

例えば

public class Main {

    public static class MyObject {

        public int value;

        @Override
        public String toString() {
            return "MyObject [value=" + value + "]";
        }

    }

    public static void main(String str[]) throws IOException {
        Set<MyObject> myObjects = new TreeSet<MyObject>(
                new Comparator<MyObject>() {

                    public int compare(MyObject object1, MyObject object2) {
                        return object1.value - object2.value;
                    }
                });

        addMyObjects(myObjects);
        addMyObjects(myObjects); // try to add the duplicates

        System.out.println(myObjects);
    }

    private static void addMyObjects(Set<MyObject> set){
        for (int i = 0; i < 5; i++) {
            MyObject myObject = new MyObject();
            myObject.value = i;
            set.add(myObject);
        }
    }
}
于 2013-10-15T12:55:20.600 に答える