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

回答編集履歴

2

Stream処理

2017/09/24 18:31

投稿

swordone
swordone

スコア20675

answer CHANGED
@@ -15,7 +15,7 @@
15
15
  .sorted(Comparator.comparing(e -> e.getValue(), Comparator.reverseOrder()))
16
16
  // 先頭から、つまり登場回数の多いほうから10個に制限
17
17
  .limit(10)
18
- .forEachOrdered(e -> System.out.println(e.getKey());
18
+ .forEachOrdered(e -> System.out.println(e.getKey()));
19
19
  }
20
20
  ```
21
21
  これを使わないなら、
@@ -23,4 +23,23 @@
23
23
  0. ソート用にその配列を複製し、ソートする
24
24
  0. ソートした配列の上位から数値を取り、元の配列からその数値を取るインデックス番号を探す
25
25
 
26
- というのを繰り返していくことになると思います。
26
+ というのを繰り返していくことになると思います。
27
+
28
+ ---
29
+
30
+ 追記 最初から最後までStreamで処理する
31
+
32
+ ```java
33
+ public static void main(String[] args) {
34
+ // 諸々の宣言
35
+
36
+ Map<Character, Long> map = s.codePoints().mapToObj(i -> (char)i)
37
+ .collect(Collectors.groupingBy(c -> c, Collectors.counting()));
38
+ map.entrySet().stream()
39
+ .sorted(Comparator.<Map.Entry<Character, Long>, Long>comparing(e -> e.getValue(),
40
+ Comparator.reverseOrder())
41
+ .thenComparing(e -> e.getKey()))
42
+ .limit(10)
43
+ .forEachOrdered(e -> System.out.println(e.getKey()));
44
+ }
45
+ ```

1

追記、不足している括弧の補充

2017/09/24 18:30

投稿

swordone
swordone

スコア20675

answer CHANGED
@@ -1,5 +1,6 @@
1
1
  何を使ってもいいなら、Mapを使うと集計は簡単です。
2
2
  ソートが若干面倒ですが、LouiS0616さんが言うような「ソート時情報が消える」ということはなくなります。
3
+ (以下はJava8の書き方で、動作未検証)
3
4
  ```java
4
5
  public static void main(String[] args) {
5
6
 
@@ -11,7 +12,7 @@
11
12
  }
12
13
  countMap.entrySet().stream()
13
14
  // 登場回数の多い順に並べ替える
14
- .sorted(Comparator.comparing(e -> e.getValue(), Comparator.reverseOrder())
15
+ .sorted(Comparator.comparing(e -> e.getValue(), Comparator.reverseOrder()))
15
16
  // 先頭から、つまり登場回数の多いほうから10個に制限
16
17
  .limit(10)
17
18
  .forEachOrdered(e -> System.out.println(e.getKey());