回答編集履歴
1
指摘に対応
answer
CHANGED
@@ -12,20 +12,16 @@
|
|
12
12
|
|
13
13
|
private static <T> List<T> zippingMap(List<T> l1, List<T> l2, BinaryOperator<T> operator, List<T> acc) {
|
14
14
|
if (l1.size() == 0 || l2.size() == 0) return acc;
|
15
|
-
acc.add(operator.apply(l1.
|
15
|
+
acc.add(operator.apply(l1.get(0), l2.get(0)));
|
16
|
-
return zippingMap(l1, l2, operator, acc);
|
16
|
+
return zippingMap(l1.subList(1, l1.size()), l2.subList(1, l2.size()), operator, acc);
|
17
17
|
}
|
18
18
|
|
19
|
-
static <T> List<T> zippingMap(List<T> l1, List<T> l2, BinaryOperator<T> operator) {
|
20
|
-
return zippingMap(new ArrayList<>(l1), new ArrayList<>(l2), operator, new ArrayList<>());
|
21
|
-
}
|
22
|
-
|
23
19
|
public static void main(String[] args) {
|
24
20
|
|
25
21
|
List<Integer> l1 = Arrays.asList(1, 3, 5, 7, 9);
|
26
|
-
List<Integer> l2 = Arrays.asList(
|
22
|
+
List<Integer> l2 = Arrays.asList(2, 4, 6, 8, 10);
|
27
23
|
|
28
|
-
List<Integer> result = zippingMap(l1, l2, (a, b) -> a + b);
|
24
|
+
List<Integer> result = zippingMap(l1, l2, (a, b) -> a + b, new ArrayList<>());
|
29
25
|
System.out.println(result);
|
30
26
|
|
31
27
|
}
|
@@ -33,11 +29,11 @@
|
|
33
29
|
}
|
34
30
|
```
|
35
31
|
|
36
|
-
**
|
32
|
+
**Scala**
|
37
33
|
|
38
34
|
Scalaで書くとこうなる。
|
39
35
|
|
40
|
-
```
|
36
|
+
```Scala
|
41
37
|
object ZipAndMap extends App {
|
42
38
|
val l1 = List(1,3,5,7,9)
|
43
39
|
val l2 = List(2,4,6,8,10)
|
@@ -45,11 +41,11 @@
|
|
45
41
|
}
|
46
42
|
```
|
47
43
|
|
48
|
-
**
|
44
|
+
**Python**
|
49
45
|
|
50
|
-
初心者の私が
|
46
|
+
初心者の私がPythonで書くとこうなる。
|
51
47
|
|
52
|
-
```
|
48
|
+
```Python
|
53
49
|
l1 = [1,3,5,7,9]
|
54
50
|
l2 = [2,4,6,8,10]
|
55
51
|
map(lambda x: x[0] + x[1], zip(l1,l2))
|
@@ -57,7 +53,7 @@
|
|
57
53
|
|
58
54
|
**Java**
|
59
55
|
|
60
|
-
`zip`と`tuple`でやるとこうなる。
|
56
|
+
`zip`と`tuple`でやるとこうなる。
|
61
57
|
|
62
58
|
```Java
|
63
59
|
import java.util.ArrayList;
|
@@ -73,24 +69,28 @@
|
|
73
69
|
|
74
70
|
static <T,U> List<Tuple<T,U>> zip(List<T> l1, List<U> l2, List<Tuple<T,U>> acc) {
|
75
71
|
if (l1.size()==0 ||l2.size()==0) return acc;
|
76
|
-
acc.add(new Tuple<>(l1.
|
72
|
+
acc.add(new Tuple<>(l1.get(0),l2.get(0)));
|
77
|
-
return zip(l1,l2,acc);
|
73
|
+
return zip(l1.subList(1,l1.size()),l2.subList(1,l2.size()),acc);
|
78
74
|
}
|
79
|
-
|
80
|
-
static <T,U> List<Tuple<T,U>> zip(List<T> l1, List<U> l2) {
|
81
|
-
return zip(new ArrayList<>(l1),new ArrayList<>(l2),new ArrayList<>());
|
82
|
-
}
|
83
75
|
|
84
76
|
public static void main(String[] args) {
|
85
77
|
|
86
78
|
List<Integer> l1 = Arrays.asList(1,3,5,7,9);
|
87
|
-
List<Integer> l2 = Arrays.asList(
|
79
|
+
List<Integer> l2 = Arrays.asList(2,4,6,8,10);
|
88
80
|
|
89
|
-
List<Tuple<Integer,Integer>> acc = zip(l1,l2);
|
81
|
+
List<Tuple<Integer,Integer>> acc = zip(l1,l2,new ArrayList<>());
|
90
82
|
List<Integer> result = acc.stream().collect(ArrayList::new, (a,e) -> a.add(e._1 + e._2), List::addAll);
|
91
83
|
System.out.println(result);
|
92
84
|
|
93
85
|
}
|
94
86
|
|
95
87
|
}
|
96
|
-
```
|
88
|
+
```
|
89
|
+
|
90
|
+
**指摘への対応**
|
91
|
+
|
92
|
+
- `unmodifiableList`に対応できない
|
93
|
+
やりたいことは関数型言語のListのhead/tail相当の処理なので、List#get(0)/List#subList(1,<リストのサイズ>)を使うことで効率よく同等の処理ができました。
|
94
|
+
|
95
|
+
- スタックオーバーフローにはあえて対応していません。
|
96
|
+
末尾再帰を最適化できる言語があるからです。
|