"汎用配列を作成します"エラーと戯れる
- どう書く?org: アレイのuniq (http://ja.doukaku.org/comment/1029/)
import java.util.Arrays; import java.util.LinkedHashSet; public class Unique { public static Object[] toUniqueArray(Object[] array) { return new LinkedHashSet(Arrays.asList(array)).toArray(); } }
勉強のためこれをGenerics化しようと思った。Collectionオブジェクト を
import java.util.Arrays; import java.util.LinkedHashSet; import java.lang.reflect.Array; public class test { public static <T> T[] toUniqueArray(T[] arr) { T[] t = (T[])Array.newInstance(arr.getClass().getComponentType(), 0); return new LinkedHashSet<T>(Arrays.asList(arr)).toArray(t); } public static void main(String[] args) { Integer[] arr = test.toUniqueArray(new Integer[]{4, 1, 2, 2, 3, 4, 2, 8}); System.out.println(Arrays.asList(arr)); } } # 実行結果 [4, 1, 2, 3, 8]
これはちょろっと書きたいときに書けない方法である。かと言って T でなく Object を使用するのもどうかと思う。この辺の設計を実戦ではどうすべきかは非常に悩む。つまり配列とコレクションクラスをどう使い分けるか。Javaの達人がいたら教えて欲しい。ワイルドカードを使用すればさらに完璧になると思うが、それに関しては後日調べるつもり。
コレクションクラスはGenericsが入ってきてかなり敷居が高くなったのでJavaに力を入れて勉強するつもり。Javaの勉強ページも作成しようかな。以下はかなり参考になった。
- @IT: Java TIPS -- 配列とコレクション間の相互変換を行う (http://www.atmarkit.co.jp/fjava/javatips/080java009.html)