回答編集履歴

1

指摘に対応

2020/05/24 00:02

投稿

xebme
xebme

スコア1090

test CHANGED
@@ -26,17 +26,9 @@
26
26
 
27
27
  if (l1.size() == 0 || l2.size() == 0) return acc;
28
28
 
29
- acc.add(operator.apply(l1.remove(0), l2.remove(0)));
29
+ acc.add(operator.apply(l1.get(0), l2.get(0)));
30
30
 
31
- return zippingMap(l1, l2, operator, acc);
32
-
33
- }
34
-
35
-
36
-
37
- static <T> List<T> zippingMap(List<T> l1, List<T> l2, BinaryOperator<T> operator) {
38
-
39
- return zippingMap(new ArrayList<>(l1), new ArrayList<>(l2), operator, new ArrayList<>());
31
+ return zippingMap(l1.subList(1, l1.size()), l2.subList(1, l2.size()), operator, acc);
40
32
 
41
33
  }
42
34
 
@@ -48,11 +40,11 @@
48
40
 
49
41
  List<Integer> l1 = Arrays.asList(1, 3, 5, 7, 9);
50
42
 
51
- List<Integer> l2 = Arrays.asList(0, 2, 4, 6, 8);
43
+ List<Integer> l2 = Arrays.asList(2, 4, 6, 8, 10);
52
44
 
53
45
 
54
46
 
55
- List<Integer> result = zippingMap(l1, l2, (a, b) -> a + b);
47
+ List<Integer> result = zippingMap(l1, l2, (a, b) -> a + b, new ArrayList<>());
56
48
 
57
49
  System.out.println(result);
58
50
 
@@ -68,7 +60,7 @@
68
60
 
69
61
 
70
62
 
71
- **scala**
63
+ **Scala**
72
64
 
73
65
 
74
66
 
@@ -76,7 +68,7 @@
76
68
 
77
69
 
78
70
 
79
- ```scala
71
+ ```Scala
80
72
 
81
73
  object ZipAndMap extends App {
82
74
 
@@ -92,15 +84,15 @@
92
84
 
93
85
 
94
86
 
95
- **python**
87
+ **Python**
96
88
 
97
89
 
98
90
 
99
- 初心者の私がpythonで書くとこうなる。
91
+ 初心者の私がPythonで書くとこうなる。
100
92
 
101
93
 
102
94
 
103
- ```python
95
+ ```Python
104
96
 
105
97
  l1 = [1,3,5,7,9]
106
98
 
@@ -116,7 +108,7 @@
116
108
 
117
109
 
118
110
 
119
- `zip`と`tuple`でやるとこうなる。あなた嫌われていませんか。
111
+ `zip`と`tuple`でやるとこうなる。
120
112
 
121
113
 
122
114
 
@@ -148,17 +140,9 @@
148
140
 
149
141
  if (l1.size()==0 ||l2.size()==0) return acc;
150
142
 
151
- acc.add(new Tuple<>(l1.remove(0),l2.remove(0)));
143
+ acc.add(new Tuple<>(l1.get(0),l2.get(0)));
152
144
 
153
- return zip(l1,l2,acc);
154
-
155
- }
156
-
157
-
158
-
159
- static <T,U> List<Tuple<T,U>> zip(List<T> l1, List<U> l2) {
160
-
161
- return zip(new ArrayList<>(l1),new ArrayList<>(l2),new ArrayList<>());
145
+ return zip(l1.subList(1,l1.size()),l2.subList(1,l2.size()),acc);
162
146
 
163
147
  }
164
148
 
@@ -170,11 +154,11 @@
170
154
 
171
155
  List<Integer> l1 = Arrays.asList(1,3,5,7,9);
172
156
 
173
- List<Integer> l2 = Arrays.asList(0,2,4,6,8);
157
+ List<Integer> l2 = Arrays.asList(2,4,6,8,10);
174
158
 
175
159
 
176
160
 
177
- List<Tuple<Integer,Integer>> acc = zip(l1,l2);
161
+ List<Tuple<Integer,Integer>> acc = zip(l1,l2,new ArrayList<>());
178
162
 
179
163
  List<Integer> result = acc.stream().collect(ArrayList::new, (a,e) -> a.add(e._1 + e._2), List::addAll);
180
164
 
@@ -189,3 +173,19 @@
189
173
  }
190
174
 
191
175
  ```
176
+
177
+
178
+
179
+ **指摘への対応**
180
+
181
+
182
+
183
+ - `unmodifiableList`に対応できない
184
+
185
+  やりたいことは関数型言語のListのhead/tail相当の処理なので、List#get(0)/List#subList(1,<リストのサイズ>)を使うことで効率よく同等の処理ができました。
186
+
187
+
188
+
189
+ - スタックオーバーフローにはあえて対応していません。
190
+
191
+  末尾再帰を最適化できる言語があるからです。