0

プリミティブではないオブジェクトを含むセットに(このメソッドhttp://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Sets.htmlを使用して) インターサーションを適用したいと考えています。私はこのコードを書きましたが、交差点が空です..

        Concept a = new Concept("Dog");
        Concept b = new Concept("Tree");
        Concept c= new Concept("Dog");
        HashSet<Concept> set_1 = new HashSet<Concept>();
        HashSet<Concept> set_2 = new HashSet<Concept>();

        set_1.add(a);
        set_1.add(b);
        set_1.add(c);
        SetView<Concept> inter = Sets.intersection(set_1,set_2);
        System.out.println(inter.size());  ----> I HAVE ZERO !!!

このConceptクラスには、String 型のプライベート メンバーと、get および set のメソッドのみが含まれています。and はありませequals()hashCode()

4

3 に答える 3

1

これは期待どおりに機能します(通知equalsおよびhashCodeオンConcept

package com.stackoverflow.so19634761;

import com.google.common.collect.Sets;
import com.google.common.collect.Sets.SetView;

import java.util.Set;

public class ISect {
    public static void main(final String[] args) {
        final Concept a = new Concept("Dog");
        final Concept b = new Concept("Tree");
        final Concept c= new Concept("Dog");
        final Set<Concept> set1 = Sets.newHashSet(a);
        final Set<Concept> set2 = Sets.newHashSet(b, c);

        final SetView<Concept> inter = Sets.intersection(set1, set2);
        System.out.println(inter); // => [Concept [data=Dog]]
    }

    private static class Concept {

        private final String data;

        // below this point code was generated by eclipse.

        public String getData() {
            return data;
        }

        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + ((data == null) ? 0 : data.hashCode());
            return result;
        }

        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Concept other = (Concept) obj;
            if (data == null) {
                if (other.data != null)
                    return false;
            } else if (!data.equals(other.data))
                return false;
            return true;
        }

        public Concept(String data) {
            this.data = data;
        }   

        @Override
        public String toString() {
            return "Concept [data=" + data + "]";
        }
    }
}
于 2013-10-28T12:35:51.687 に答える
0

ストリングスではなく、セット内にコンセプトを入れています-犬、ツリー。また、それを機能させるには、概念クラスのハッシュコードと等号をオーバーライドする必要があります

于 2013-10-28T12:27:36.747 に答える
0

まず、 Concept クラスをオーバーライドequalsしてメソッドを作成する必要があります。hashcodeサードパーティのライブラリは必要ありません。使うだけ

  set_1.retainAll(set2);

set_1.retainAll(set2)set_1 を set_1 と set_2 の共通部分に変換します。(2 つのセットの共通部分は、両方のセットに共通する要素のみを含むセットです。)

于 2013-10-28T12:26:03.257 に答える