はじめに
二次元配列的な入力を縦に処理する必要があるコーディング問題によく遭遇します。
毎回頭を悩ませるので解決方法を整理してみました。
問題
100 100 50
200 150 100
130 200 30
みたいな入力が与えられて、列を1グループとして扱わないといけないケースについて。
上の例だと
グループ1:100 200 130
グループ2:100 150 200
グループ3:50 100 30
みたいなイメージ。
標準入力やファイルからのインプットを処理するときは行ごとに処理していくのでこれを列単位にまとめるのに苦労していました。
解決方法
試行錯誤した結果、今のところ一番スマートだと思うやり方。
String[] inputs = {
"100 100 50",
"200 150 100",
"130 200 30"
};
// 取り組んでいるコーディング問題では行×列の個数はだいたい先に与えられる
int columnNum = inputs[0].split(" ").length;
Map<Integer, List<Integer>> map = new HashMap<>();
for (int i = 0; i < columnNum; i++) {
List<Integer> elements = new ArrayList<>();
for (String s : inputs) {
elements.add(Integer.parseInt(s.split(" ")[i])); // この例では数値として扱いたいのでparseInt
}
map.put(i, elements);
}
System.out.println(map); // {0=[100, 200, 130], 1=[100, 150, 200], 2=[50, 100, 30]}
おわりに
行×列の入力を列単位に処理する方法でした。
ちなみに、実業務でこういう処理が必要な場面は今のところ遭遇してません。
他にもこんなやり方あるよ、などあったら是非教えてください。