2017-04-26 17 views
1

オープンセットの集合である可能性のあるトポロジをテストしようとしています。これを行うには、集合の組合や交差を見つける必要があります。そうすることで、Generated Topologyを作成することができます。Java(生成されたトポロジ)の集合の組合と交点

Set<Set<String>> myCollection = new HashSet<>(); 

Iドン: - 私は、見つける、少なくとも外部ライブラリを使用せずにすることができると思う最高のfollowing(最後の答え)などの何かをすることで、Googleは多重集合機能を持つGuavaライブラリを持っているようですMultisetのさまざまなメソッドを学習しようとすると価値があるかどうかを知ることができます。何とかしてループして "myCollection"にセットを追加するだけです。 MultisetBagのようなものを使用した場合のメリットについてのアドバイスはありますか?

具体的には、私は部分集合の集合(スーパーセット)を持っているでしょう、私たちはスーパーセットはおそらく数十の要素で、非常に大きなを取得するつもりはありませんので、{{A,B,D}, {B,C}, {B}, {A,B,C,D}}.の新しいスーパーセットを{A,B,D} U {B,C} = {A,B,C,D}${A,B,D} ∩ {B,C} = {B}$を見ることができる例{{A,B,D}, {B,C}}のために言います最も。

答えて

1

Multisetは、Setに複数の同じ要素を含めることができるSetが必要な場合に便利です(Setは各要素の1つしか保持できません)。

あなたが複数の労働組合や交差点Set Sを見つけるために探しているなら、それはSets.javaであなたに有用であろう次のメソッドがあるとして、私は、Googleのグアバのライブラリを使用してをお勧めします

static <E> Sets.SetView<E> union(Set<? extends E> set1, Set<? extends E> set2) 
static <E> Sets.SetView<E> intersection(Set<E> set1, Set<?> set2) 
は、

あなたはむしろグアバを使用したくない場合、あなたはJavaで二組の労働組合との交差点の両方を見つけることができる方法があります。

Set<Integer> first = new HashSet<>(Arrays.asList(1, 3, 5, 7)); 
Set<Integer> second = new HashSet<>(Arrays.asList(2, 4, 6, 8)); 

// Creates a new Set as a copy of 'first' and then adds every element from 'second' into the new Set, creating a union. 
Set<Integer> union = new HashSet<>(first); 

union.addAll(second); 

System.out.println(union); 

>> {1, 2, 3, 4, 5, 6, 7, 8} 

// Creates a new Set as a copy of 'first' and then removes every element from the new Set that is not contained within 'second', creating an intersection. 
Set<Integer> intersection = new HashSet<>(first); 

intersection.retainAll(second); 

System.out.println(intersection); 

>> {} 
0

私はあなたの質問CORRを理解していればあなたは、セットのセットを受け取り、1つ以上のメンバーのメンバーであるか、1つ以上のメンバーのメンバーであるセットを追加するメソッドが必要です。

これが正しければ、確かに標準のJavaで行うことができます.Guavaやその他のライブラリは必要ありません。労働組合や交差点を見つけるため

書き込み方法はかなり簡単です:

Set<T> union(Set<Set<T>> sets) { 
    return sets.stream().reduce(new HashSet<>(), 
     (s1, s2) -> { 
      s1.addAll(s2); 
      return s1; 
     }); 
} 

交差点がやや困難です:

Set<T> intersection(Set<Set<T>> sets) { 
    return sets.stream().map(HashSet::new).reduce(
     (s1, s2) -> { 
      s1.retainAll(s2); 
      return s1; 
     }); 
} 

そして、もっと複雑な:あなたがそれらを変更することを避けるためにセットをコピーする必要がありますbit:メンバーのすべての組み合わせに対してこれらの操作を実行します。

void topology(Set<Set<T>> sets) { 
    process(new HashSet<>(sets), sets); 
} 

private void process(Set<Set<T>> input, Set<Set<T>> output) { 
    if (!input.isEmpty()) { 
     output.add(union(input)); 
     output.add(intersection(input)); 
     input.stream().forEach(el1 -> 
      process(input.stream().filter(el2 -> !el1.equals(el2)) 
       .collect(toSet()), output)); 
    } 
} 

これらの方法の詳細な説明が必要な場合は、私にご連絡ください。

Iは{{1、3、5}、{2、3 7}、{4、7、9}のセットでこれを試みた結果、受信した:Iにより推定

[[], [1, 2, 3, 5, 7], [3], [4, 7, 9], [7], [1, 3, 5], [2, 3, 4, 7, 9], [2, 3, 7], [1, 3, 4, 5, 7, 9], [1, 2, 3, 4, 5, 7, 9]] 

を元のセットの最初と最後の要素が重複しないため、空のセットが結果に必要な問題の定義。

関連する問題