以前 Javaで冪集合を生成する - アルゴリズム学習(その3) - $shibayu36->blog; で冪集合を作るメソッドを実装していた。しかし、以前の実装だとList
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]]
ジェネリクスについては以下の記事が参考になる。