読者です 読者をやめる 読者になる 読者になる

$shibayu36->blog;

プログラミングの話や自分の考えを色々と書いています。

冪集合を作るメソッドをジェネリクス対応する

tech java

以前 Javaで冪集合を生成する - アルゴリズム学習(その3) - $shibayu36->blog; で冪集合を作るメソッドを実装していた。しかし、以前の実装だとListでしか冪集合を作ることができなかった。最近パーフェクトJavaを読んで、ジェネリクスについて学んだので、試しに冪集合を作るメソッドをジェネリクス対応してみた。コードは ここ においてある。

package org.shibayu36.algorithms;
import java.util.ArrayList;
import java.util.List;

public class PowerSetGenerics {
  public static <T> List<List<T>> make(List<T> data) {
    if (data.size() == 0) {
      List<List<T>> empty = new ArrayList<>();
      empty.add(new ArrayList<>());
      return empty;
    }

    List<List<T>> result = new ArrayList<>();
    for (int i = 0; i < Math.pow(2, data.size()); i++) {

      List<T> set = new ArrayList<>();
      int flags = i;
      for (int j = 0; j < data.size(); j++) {
        int flag = flags % 2;
        if (flag == 1) {
          set.add(data.get(j));
        }
        flags = flags / 2;
      }
      result.add(set);
    }

    return result;
  }
}

前とのdiffはこれだけ。メソッドローカルの型変数を宣言して、Integerの変わりにこれを利用すれば良いだけ。

@@ -3,18 +3,18 @@
 import java.util.ArrayList;
 import java.util.List;
 
-public class PowerSet1 {
-  public static List<List<Integer>> make(List<Integer> data) {
+public class PowerSetGenerics {
+  public static <T> List<List<T>> make(List<T> data) {
     if (data.size() == 0) {
-      List<List<Integer>> empty = new ArrayList<>();
+      List<List<T>> empty = new ArrayList<>();
       empty.add(new ArrayList<>());
       return empty;
     }
 
-    List<List<Integer>> result = new ArrayList<>();
+    List<List<T>> result = new ArrayList<>();
     for (int i = 0; i < Math.pow(2, data.size()); i++) {
 
-      List<Integer> set = new ArrayList<>();
+      List<T> set = new ArrayList<>();
       int flags = i;
       for (int j = 0; j < data.size(); j++) {
         int flag = flags % 2;

これで次のように、Integer以外の型でも冪集合を作れるようになった。便利。

List<List<Integer>> integerPowerSet = PowerSetGenerics.make(Arrays.asList(1, 2, 3));
System.out.println(integerPowerSet.toString());

List<List<String>> stringPowerSet = PowerSetGenerics.make(Arrays.asList("hoge", "fuga", "bar"));
System.out.println(stringPowerSet.toString());

// [[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]]
// [[], [hoge], [fuga], [hoge, fuga], [bar], [hoge, bar], [fuga, bar], [hoge, fuga, bar]]


ジェネリクスについては以下の記事が参考になる。