回答編集履歴

2

Streamを使ってみようとした

2016/05/07 17:32

投稿

swordone
swordone

スコア20649

test CHANGED
@@ -54,6 +54,90 @@
54
54
 
55
55
  ```
56
56
 
57
+ 更にこれをなんとかStreamで書けないか試してみた…が、余り綺麗に書けなかったです。
58
+
59
+ ```java
60
+
61
+ import java.util.ArrayList;
62
+
63
+ import java.util.Arrays;
64
+
65
+ import java.util.List;
66
+
67
+ import java.util.function.Function;
68
+
69
+ import java.util.stream.IntStream;
70
+
71
+ import java.util.stream.Stream;
72
+
73
+
74
+
75
+ public class Q34167_2 {
76
+
77
+ public static void main(String[] args) {
78
+
79
+ int[] coins = {1, 5, 10, 50, 100, 500};
80
+
81
+
82
+
83
+ // 一枚しか使えない硬貨
84
+
85
+ List<Integer> once = Arrays.asList(new Integer[]{5, 50, 500});
86
+
87
+
88
+
89
+ // Stream内のListの最後の番号に応じ、次の番号を詰めたすべてのパターンのListのStreamを返す
90
+
91
+ Function<List<Integer>, Stream<List<Integer>>> f =
92
+
93
+ e -> {
94
+
95
+ int last = e.get(e.size() - 1);
96
+
97
+ if (once.contains(coins[last])){
98
+
99
+ last++;
100
+
101
+ }
102
+
103
+ return IntStream.range(last, coins.length).mapToObj(i -> {
104
+
105
+ List<Integer> l = new ArrayList<>(e);
106
+
107
+ l.add(i);
108
+
109
+ return l;
110
+
111
+ });
112
+
113
+ };
114
+
115
+
116
+
117
+ IntStream.range(0, coins.length).mapToObj(i -> {
118
+
119
+ List<Integer> list = new ArrayList<>();
120
+
121
+ list.add(i);
122
+
123
+ return list;
124
+
125
+ }).flatMap(f).flatMap(f)
126
+
127
+ .mapToInt(e -> e.stream().mapToInt(i -> coins[i]).sum())
128
+
129
+ .sorted().forEach(System.out::println);
130
+
131
+ }
132
+
133
+
134
+
135
+ }
136
+
137
+
138
+
139
+ ```
140
+
57
141
 
58
142
 
59
143
  旧回答

1

コード

2016/05/07 17:32

投稿

swordone
swordone

スコア20649

test CHANGED
@@ -1,6 +1,62 @@
1
+ ちょっとした工夫を思いついてしまったので、そのコードを書いてしまいます(Java8)。
2
+
3
+ ```java
4
+
5
+ import java.util.ArrayList;
6
+
7
+ import java.util.Arrays;
8
+
1
- コード化はまだですが、考え方を…
9
+ import java.util.List;
2
10
 
3
11
 
12
+
13
+ public class Q34167_2 {
14
+
15
+ public static void main(String[] args) {
16
+
17
+ int[] coins = {1, 5, 10, 50, 100, 500};
18
+
19
+
20
+
21
+ // 一枚しか使えない硬貨
22
+
23
+ List<Integer> once = Arrays.asList(new Integer[]{5, 50, 500});
24
+
25
+ List<Integer> total = new ArrayList<>();
26
+
27
+ for (int i = 0; i < coins.length; i++) {
28
+
29
+
30
+
31
+ // 一枚しか使えない硬貨を前のステップで使っていた場合には次の硬貨から、そうでなければ同じ硬貨から選択
32
+
33
+ for(int j = once.contains(coins[i]) ? i + 1 : i; j < coins.length ; j++) {
34
+
35
+ for (int k = once.contains(coins[j]) ? j + 1 : j; k < coins.length; k++){
36
+
37
+ total.add(coins[i] + coins[j] + coins[k]);
38
+
39
+ }
40
+
41
+ }
42
+
43
+ }
44
+
45
+ total.stream().sorted().forEach(System.out::println);
46
+
47
+ }
48
+
49
+
50
+
51
+ }
52
+
53
+
54
+
55
+ ```
56
+
57
+
58
+
59
+ 旧回答
4
60
 
5
61
  ---
6
62