teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

指摘に対応

2020/05/24 00:02

投稿

xebme
xebme

スコア1109

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.remove(0), l2.remove(0)));
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(0, 2, 4, 6, 8);
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
- **scala**
32
+ **Scala**
37
33
 
38
34
  Scalaで書くとこうなる。
39
35
 
40
- ```scala
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
- **python**
44
+ **Python**
49
45
 
50
- 初心者の私がpythonで書くとこうなる。
46
+ 初心者の私がPythonで書くとこうなる。
51
47
 
52
- ```python
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.remove(0),l2.remove(0)));
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(0,2,4,6,8);
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
+  末尾再帰を最適化できる言語があるからです。