縦と横を入れ替える 2014/06/08

転置行列 - Wikipedia

javaです。java8です。

以前から、そうかなり以前から、エクセルの操作で、行と列を入れ替えて、ペーストするやり方になにかしらの思いがあるのでした。

たまに思い出したように、javaで書くのですが、まあ、すっきりしません。

groovyにはtransposeがあるので、さくっとできました。
def ssss = [ ["1", "2", "3"], ["a", "b", "c"], ["A", "B", "C"] ] ssss.each { a -> println "$a" } ssss.transpose().each { a -> println "$a" }

結果
[1, 2, 3]
[a, b, c]
[A, B, C]
[1, a, A]
[2, b, B]
[3, c, C]

縦と横の値の数が一緒であれば、配列であれば添字を入れ替えるだけで実現できます。
これが不思議なんですよね。この不思議な性質というか、これをコードにおとすとエラーチェックしなければすごくシンプルなんですよね。
ループとか繰り返しとか、関係なくて、もちろん実現するのにはループを使いますが、この入れ替えるだけが、何にか不思議で、うまく説明できませんが。
とりあえず以下
package a; public class TestKaiten2 { public static void main(String[] args) { a(); } static void a() { String[][] ssss = { { "1", "2", "3" }, { "a", "b", "c" }, { "A", "B", "C" } }; int len = ssss.length; // 行と列の数が一致していること String[][] ssss2 = new String[len][len]; for (int i = 0; i < len; i++) { for (int j = 0; j < len; j++) { ssss2[j][i] = ssss[i][j]; } } print(ssss); print(ssss2); } static void print(String[][] ssss) { for (String[] ss : ssss) { for (String s : ss) { System.out.printf("%s ", s); } System.out.println(); } } }

結果
 1 2 3
a b c
A B C
1 a A
2 b B
3 c C

java8のラムダ式の練習がてらに
package a; import static java.util.Arrays.asList; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.IntStream; public class Test2 { public static void main(String[] args) { a(); } static void a() { List<List<String>> listoflists = asList(asList("1", "2", "3"), asList("a", "b", "c"), asList("A", "B", "C")); listoflists.stream().map(list -> list).forEach(System.out::println); // 結果の入れ物 Map<Integer, List<String>> map = new HashMap<Integer, List<String>>(); // IntStream.range(0, listoflists.size()).forEach(i -> { List<String> list = listoflists.get(i); IntStream.range(0, list.size()).forEach(j -> { // getOrDefault List<String> l = map.getOrDefault(j, new ArrayList<>()); String s = list.get(j); l.add(s); // putIfAbsent map.putIfAbsent(j, l); }); }); // 結果の出力 map.entrySet().forEach(e -> { List<String> l = e.getValue(); l.forEach(s -> { System.out.printf("%s ", s); }); System.out.println(); }); } }

結果
[1, 2, 3]
[a, b, c]
[A, B, C]
1 a A
2 b B
3 c C

: