質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

266閲覧

文字コードについての質問です。

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2017/09/24 12:01

###前提・実現したいこと
アルファベットの小文字の頻度分布を調べて、よく使う小文字を上から10個表示するプログラムを作っているのですが、よく使う小文字を上から10個表示することができません。
どうしたら表示することができるでしょうか?
よろしくお願いします!!

###該当のソースコード
import java.util.Scanner;
public class LowerRanking {
public static void main(String[] args) {
String s;
char c;
int n = 0;
int temp;
int countTable[] = new int[128];

Scanner kbd = new Scanner(System.in); while(kbd.hasNext()) { s = kbd.next(); for(int i = 0; i<s.length(); i++) { c = s.charAt(i); countTable[c] = countTable[c]+1; } } for(int i = 97; i<=122; i++) { System.out.println(i+":"+(char)i+":"+countTable[i]); } if(s.length() == 0) { System.out.println("No Data."); }else{ for(int i= 0; i<s.length()-1; i++) { for(int j = i+1; j<s.length(); j++) { if(countTable[i]<countTable[j]) { temp = countTable[i]; countTable[i] = countTable[j]; countTable[j] = temp; } } } } if(s.length()<=10) { for(int i = 0; i<s.length(); i++) { System.out.printf("countTable[%d]=%d\n",i,countTable[i]); } }else{ for(int i = 0; i<10; i++) { System.out.printf("countTable[%d]=%d\n",i,countTable[i]); } } for(int i = 10; i<s.length(); i++) { if(countTable[9] == countTable[i]){ System.out.printf("countTable[%d]=%d\n",i,countTable[i]); } } } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

A-pZ

2017/09/24 12:31

コンパイルエラーが発生しているのと、上位10個を並べる処理が一切かかれていません。書き漏れ、書き間違いがあると思いますので、訂正すると回答がつくでしょうか。
退会済みユーザー

退会済みユーザー

2017/09/24 12:56

sが初期化されていないとエラーが出るのですが、Stringなので初期化するとダメでよくわからないんです... 上位10個を並べるのはif(s.length()<=10) { 〜です! もうどこを訂正すればいいのかすらわからなくて...すみません。。
guest

回答2

0

何を使ってもいいなら、Mapを使うと集計は簡単です。
ソートが若干面倒ですが、LouiS0616さんが言うような「ソート時情報が消える」ということはなくなります。
(以下はJava8の書き方で、動作未検証)

java

1public static void main(String[] args) { 2 3 // 諸々の宣言 4 5 Map<Character, Integer> countMap = new HashMap<>(); 6 for(int i = 0; i < s.length(); i++) { 7 countMap.merge(s.charAt(i), 1, Integer::sum); 8 } 9 countMap.entrySet().stream() 10 // 登場回数の多い順に並べ替える 11 .sorted(Comparator.comparing(e -> e.getValue(), Comparator.reverseOrder())) 12 // 先頭から、つまり登場回数の多いほうから10個に制限 13 .limit(10) 14 .forEachOrdered(e -> System.out.println(e.getKey())); 15}

これを使わないなら、
0. 配列を使って文字の登場回数をカウント
0. ソート用にその配列を複製し、ソートする
0. ソートした配列の上位から数値を取り、元の配列からその数値を取るインデックス番号を探す

というのを繰り返していくことになると思います。


追記 最初から最後までStreamで処理する

java

1public static void main(String[] args) { 2 // 諸々の宣言 3 4 Map<Character, Long> map = s.codePoints().mapToObj(i -> (char)i) 5 .collect(Collectors.groupingBy(c -> c, Collectors.counting())); 6 map.entrySet().stream() 7 .sorted(Comparator.<Map.Entry<Character, Long>, Long>comparing(e -> e.getValue(), 8 Comparator.reverseOrder()) 9 .thenComparing(e -> e.getKey())) 10 .limit(10) 11 .forEachOrdered(e -> System.out.println(e.getKey())); 12}

投稿2017/09/24 13:03

編集2017/09/24 18:31
swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/09/24 14:16

詳しくありがとうございます! まだmapは勉強していなくてわからないので、配列のやり方を参考にさせていただきます! mapの方も今回、swordoneさんが教えてくださったことを参考に、今後使えるように頑張りたいと思います! ありがとうございました!
guest

0

ベストアンサー

アルファベットをカウントするところまではいいとして...

Java

1if(s.length() == 0) { 2 System.out.println("No Data."); 3} else { 4 for(int i= 0; i<s.length()-1; i++) { 5 for(int j = i+1; j<s.length(); j++) { 6 if(countTable[i]<countTable[j]) { 7 temp = countTable[i]; 8 countTable[i] = countTable[j]; 9 countTable[j] = temp; 10 } 11 } 12 } 13}

なんでここでsを参照しようとする必要があるのでしょう。
入力した文字列を一時的に保管しているだけで、統計データはcountTableにあるのでは?

あとあれですね、バブルソートはメソッドとして切り出した方がいいです。


よく考えたら、この方針は無理がありそうです。
配列の添え字にアルファベットを当てはめているのですから、ソートするとその情報が消えます。
確かに上位10位までの出現頻度は表示できるかもしれません。
ただし、実際の上位の文字はわからないままです。

追記

『それ、出来ないよ』で片づけてしまうのもなんとも申し訳ないので、一つの解法を示します。

Java

1int[] workCountTable = new int[countTable.length()]; 2deepCopy(countTable, workCountTable); 3 4for(int i = 0; i < 10; i++) { 5 int argMax = getArgMax(workCountTable); 6 int max = workCountTable[argMax]; 7 8 if(max == 0) break; 9 10 System.out.println("第" + (i+1) + "位: " + char(argMax) + ": " + max + "回"); 11 workCountTable[argMax] = 0; 12}

未検証です。deepCopy getArgMaxはご自身で実装してみてください。

重要

teratailには、コードを見やすく表示する機能があります。
質問の編集画面を開き、コードを選択した状態で<code>ボタンを押してください。
右側にプレビューが表示されるので、それを参照して見やすい質問を心掛けてください。

投稿2017/09/24 12:17

編集2017/09/24 14:09
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/09/24 12:58

なるほど...この方法だと出来ないんですね。。 わかりました!ご丁寧にありがとうございます!!
退会済みユーザー

退会済みユーザー

2017/09/24 14:21

出来ましたー!! お時間たくさんいただいてしまって... 本当にありがとうございます!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問