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

回答編集履歴

2

コードの誤りを訂正

2016/12/18 18:20

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -15,19 +15,20 @@
15
15
 
16
16
  変更後のコードではtfメソッドで出現頻度を返すようになってますね。これで単語と頻度が順番に求まりますが、降順に表示するには並べ替え(ソート)をする必要があります。ソートにはいろいろやり方がありますが、単語と頻度のように複数の要素を一塊としたデータをソートする例を挙げます。
17
17
 
18
+ 追記:
19
+ 失礼、最初の例は間違ってました。List.sortはComparatorを渡さないといけないのでした。
20
+ なお下記の例は動作確認してません。
21
+ 他の方の回答も参考にして「プログラムのエラーを直す」ことを学んでいただければと思います。
22
+
18
23
  ```java
19
24
  // 単語と頻度を保持するクラスを作る
20
- class WordAndFreq implements Comparable<WordAndFreq> {
25
+ class WordAndFreq {
21
26
  String word;
22
27
  double freq;
23
28
  WordAndFreq(String word, double freq) {
24
29
  this.word = word;
25
30
  this.freq = freq;
26
31
  }
27
- @Override
28
- public int compareTo(WordAndFreq o) {
29
- return Double.compare(freq, o.freq);
30
- }
31
32
  }
32
33
  ...
33
34
  // まず頻度を調べながらWordAndFreqをListの要素として蓄積
@@ -36,7 +37,13 @@
36
37
  list.add(new WordAndFreq(word, tf(doc2, word)));
37
38
  }
38
39
  // Listをソート
40
+ list.sort(new Comparator<WordAndFreq>() {
39
- list.sort();
41
+ @Override
42
+ public int compare(WordAndFreq o1, WordAndFreq o2) {
43
+ // return Double.compare(o1.freq, o2.freq); //昇順
44
+ return Double.compare(o2.freq, o1.freq); //降順
45
+ }
46
+ });
40
47
  // ソート結果を表示
41
48
  for (WordAndFreq wf : list) {
42
49
  System.out.format("%s: %4.1f\n", wf.word, wf.freq);

1

追記

2016/12/18 18:20

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -7,4 +7,39 @@
7
7
  String doc2 = str.split(" "); //誤り
8
8
  String[] doc2 = str.split(" "); //こちらが正しい
9
9
 
10
- doc2の型の宣言が間違っているわけです。後の方はその影響で出ていたりしますね。初心者のうちは最初のエラーを直してからコンパイルして・・・というのを繰り返した方がいいかも知れません。変数の型の宣言を間違えていたりするとそれ以降エラーが沢山でてしまうので一度になおそうとしても難しいからです。
10
+ doc2の型の宣言が間違っているわけです。後の方はその影響で出ていたりしますね。初心者のうちは最初のエラーを直してからコンパイルして・・・というのを繰り返した方がいいかも知れません。変数の型の宣言を間違えていたりするとそれ以降エラーが沢山でてしまうので一度になおそうとしても難しいからです。
11
+
12
+ ---
13
+
14
+ 追記:降順
15
+
16
+ 変更後のコードではtfメソッドで出現頻度を返すようになってますね。これで単語と頻度が順番に求まりますが、降順に表示するには並べ替え(ソート)をする必要があります。ソートにはいろいろやり方がありますが、単語と頻度のように複数の要素を一塊としたデータをソートする例を挙げます。
17
+
18
+ ```java
19
+ // 単語と頻度を保持するクラスを作る
20
+ class WordAndFreq implements Comparable<WordAndFreq> {
21
+ String word;
22
+ double freq;
23
+ WordAndFreq(String word, double freq) {
24
+ this.word = word;
25
+ this.freq = freq;
26
+ }
27
+ @Override
28
+ public int compareTo(WordAndFreq o) {
29
+ return Double.compare(freq, o.freq);
30
+ }
31
+ }
32
+ ...
33
+ // まず頻度を調べながらWordAndFreqをListの要素として蓄積
34
+ List<WordAndFreq> list = new List<>();
35
+ for (String word : doc2) {
36
+ list.add(new WordAndFreq(word, tf(doc2, word)));
37
+ }
38
+ // Listをソート
39
+ list.sort();
40
+ // ソート結果を表示
41
+ for (WordAndFreq wf : list) {
42
+ System.out.format("%s: %4.1f\n", wf.word, wf.freq);
43
+ }
44
+ ...
45
+ ```