縦と横を入れ替える
2014/06/08
groovy
java
java8
ラムダ式
行列
転置行列 - Wikipedia
javaです。java8です。
以前から、そうかなり以前から、エクセルの操作で、行と列を入れ替えて、ペーストするやり方になにかしらの思いがあるのでした。
たまに思い出したように、javaで書くのですが、まあ、すっきりしません。
groovyにはtransposeがあるので、さくっとできました。
結果
縦と横の値の数が一緒であれば、配列であれば添字を入れ替えるだけで実現できます。
これが不思議なんですよね。この不思議な性質というか、これをコードにおとすとエラーチェックしなければすごくシンプルなんですよね。
ループとか繰り返しとか、関係なくて、もちろん実現するのにはループを使いますが、この入れ替えるだけが、何にか不思議で、うまく説明できませんが。
とりあえず以下
結果
java8のラムダ式の練習がてらに
結果
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
: