ちくのう症(蓄膿症)は「菌」が原因!?

文字を入力し入力されたそれぞれの文字の個数を出力したいのですが
良い処理方法が思いつきません。。。
どのようにコーディングしていけばよいでしょうか?

(例)abcb → 出力:aが1個・bが2個・cが1個

どなたかご協力お願いします!

このQ&Aに関連する最新のQ&A

A 回答 (4件)

>何かもっと単純なメソッドや条件分岐からの処理はありませんか?


ありません。

いつもいつも、そんな都合のよいものはありません。
ないから自分で作るのです。

また、もしそんなメソッドがあったとして、戻り値はどうなるでしょうか?
文字列配列や数値配列では返せないので、やはりMapのようなものになります。
つまり、どうしても必要なものですので、これを機会に覚えてしまって下さい。

>コレクション・フレームワークなどの理解にはまだまだ至っていません。。。

「コレクションフレームワーク」という名前にビビッてませんか?
そんな名前は無視して、まずはドキュメントを読んで下さい。
それほど難しいものではありません。

一応、簡単に使用例を書いておきますから、詳細は自分で調べてください。


HashMap map = new HashMap();
map.put("key-a", "value-a");
map.put("key-b", "value-b");
map.put("key-c", "value-c");
System.out.println(map.get("key-a"));
System.out.println(map.get("key-c"));

<実行結果>
value-a
value-c
    • good
    • 0
この回答へのお礼

ありがとうございます。
色々なサイトから調べてみているところです。
ご協力に感謝します。

お礼日時:2006/10/26 09:54

>文字を1文字ずつ読むとは配列として取得するということですか?


Stringに文字列を格納しているのなら
StringクラスのcharAt(int index)メソッド

StringクラスのJavaDocを1度熟読することをお奨めします。
    • good
    • 0
この回答へのお礼

StringクラスのJavaDocですね?
探してみます。
ありがとうございました。

お礼日時:2006/10/26 09:55

配列というものはご存じでしょうか?


普通の配列は添え字に数字を用いますが、添え字に文字列を使う配列があります。
「連想配列」と呼ばれるものです。
連想配列は言語によってはサポートされているものもありますが、JAVAでは言語仕様としてはサポートされていません。
言語仕様ではありませんが、代りに連想配列の機能を標準APIで提供しています。
java.util.Mapというインターフェースです。
これを使えば、文字列をキーとして任意のオブジェクトを取得・設定が行えます。

今回の場合、文字を「キー」に、カウントを「キーに割り当てられた値」とすれば簡単にカウントできます。

なお、Mapインターフェースの実装にはjava.util.HashMap等がありますので、実際にはこれを使うこととなるでしょう。

具体的な使い方はドキュメントを参照してください。

この回答への補足

詳しい解説ありがとうございます。
ですが、私があまりにも初心者なものですから
コレクション・フレームワークなどの理解には
まだまだ至っていません。。。
何かもっと単純なメソッドや条件分岐からの処理はありませんか?

補足日時:2006/10/25 16:36
    • good
    • 0

こんなところでしょうか…



文字格納構造体
 文字
 数

LOOP開始

  条件判定1:文字を1文字づつ読む 最後まで読んだらLOOP抜け

    条件判定2:格納済みの文字と1文字読んだ文字との比較
      1文字読んだ文字を文字格納構造体.文字に格納
      1文字読んだ文字で文字列を検索
      検索結果を文字格納構造体.数に格納
    条件判定2終了
  条件判定1終了
LOOP終了

この回答への補足

質問よろしいですか?
文字を1文字ずつ読むとは配列として取得するということですか?

補足日時:2006/10/25 15:39
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QJavaのカウント方法について

neko_noko様
補足の項目がなかったので新規質問という形ですが、Javaのカウント方法について続きで伺います。
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.*;

public class test01 {
static String fname ="26KYOUTO.CSV";
//Stringtoknizer st = new Stringtoknizer(line,",");
public static void main(String[] args){
if(args.length>0) fname = args[0];
try {
BufferedReader reader =
new BufferedReader(new FileReader(fname));
int count = 0;
String line = reader.readLine();
while(line != null) {
if(line.equals("26101")){//配列を設定?
count++;
}
line = reader.readLine();
}
reader.close();
//この部分で配列をソート?
System.out.println("京都府北区=" +count );
} catch(FileNotFoundException e) {
System.out.println("ファイルがありません。");
} catch(IOException e) {
System.out.println("入出力エラーです。");
}
}
}
のようにしましたが、仮に集計できても、当然郵便番号が26101=24(件)、26102=2*(件)となってしまい、北区=24(件)、下京区=2*件という形にしたければ、『if(line.equals("26101")){』の部分で文字列の配列を設定し、『reader.close();』の後に配列で計算したものをソートすれば北区=24と表示できるかと思ったのですが、クエリで集計する湖と以外で、このような方向性で正しいでしょうか。たびたびで質問で申し訳ありません。
宜しくお願い致します。

neko_noko様
補足の項目がなかったので新規質問という形ですが、Javaのカウント方法について続きで伺います。
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.*;

public class test01 {
static String fname ="26KYOUTO.CSV";
//Stringtoknizer st = new Stringtoknizer(line,",");
public static void main(String[] args){
if(args.length>0) fname = args[0];
try {
BufferedReader reader =
...続きを読む

Aベストアンサー

続きみたいですが、前回を知らないので
はずしているかも知れませんが
26KYOUTO.CSV の一行が 26101 の場所を
カウントするコードでいいのならこれで
どうでしょう、出来る限りあなたのコードは
崩していません

import java.io.*;

public class Counter {
 public static void main(String args[]) {

  String file = "26KYOUTO.CSV";
  String line = null;
  int count = 0;

   if (args.length > 0) file = args[0];

   try {
    BufferedReader br =
     new BufferedReader(new FileReader(file));

    while ((line = br.readLine()) != null) {
     if (line.equals("26101")) count++;
    }

    br.close();
   } catch (Exception e) {
   } finally {
   }
   System.out.println(count);
  }
}

続きみたいですが、前回を知らないので
はずしているかも知れませんが
26KYOUTO.CSV の一行が 26101 の場所を
カウントするコードでいいのならこれで
どうでしょう、出来る限りあなたのコードは
崩していません

import java.io.*;

public class Counter {
 public static void main(String args[]) {

  String file = "26KYOUTO.CSV";
  String line = null;
  int count = 0;

   if (args.length > 0) file = args[0];

   try {
    BufferedReader br =
     ...続きを読む

Qシンボルが見つかりませんというエラーが理解できません。

以下のようなじゃんけんゲームのプログラムを書いたのですが、「シンボルが見つかりません。」というエラーが表示されるのですが、エラーの意味が理解できず、解決できません。どこが間違っているのか教えていただけませんか。

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class janken extends Applet
implements Runnable, ActionListener {
private static final int EXTERNAL_BUFFER_SIZE = 128000;

Image image[] = new Image[3];
Thread t;
int index1 = 0;
int index2 = 0;
String msg = "";
String msg1 = "";

boolean state = false;
Button b1 = new Button("ぐー");
Button b2 = new Button("ちょき");
Button b3 = new Button("ぱー");

public void init(){
for(int i = 0; i<=2; i++){
img[i] = getImage(getDocumentBase(),"hanabi" + (i+1) + ".JPG");
}
add(b1);
add(b2);
add(b3);
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
msg1 = "結果は・・";

}

public void paint(Graphics g){
g.drawImage(img[index1],350,30,this);
g.drawImage(img[index2],695,30,this);
g.drawString("コンピューター",420,300);
g.drawString("あなた",800,300);
g.drawString(msg,630,320);
g.drawString(msg1,550,320);
}

public void start(){
state = true;
t = new Thread(this);
t.start();

}

public void run(){
while(state){
index1++;
if(index1 == 3){
index1 = 0;
}
index2++;
if(index2 == 3){
index2 = 0;
}
repaint();
try {
Thread.sleep(60);
}catch(InterruptedException e) { }
}
}

public void actionPerformed(ActionEvent e){
if(state == false) {
start();
return;

}
state = false;
if(e.getSource() == b1) {
msg = "ぐー";
index2 = 0;
}

else if(e.getSource() == b2){
msg = "ちょき";
index2 = 1;
}

else if(e.getSource() == b3){
msg = "ぱー";
index2 = 2;
}
check();
repaint();
}

public void check() {
if(index1 == index2) msg ="あいこ";


else if (index1 == 0) {
if(index2 == 2) msg="あなたの勝ち";
else msg ="あなたの負け";
}

else if(index1 == 1) {
if(index2 == 0) msg="あなたの勝ち";
else msg="あなたの負け";
}

else if(index1 == 2) {
if(index2 == 1) msg="あなたの勝ち";
else msg="あなたの負け";
}

}
}

以下のようなじゃんけんゲームのプログラムを書いたのですが、「シンボルが見つかりません。」というエラーが表示されるのですが、エラーの意味が理解できず、解決できません。どこが間違っているのか教えていただけませんか。

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class janken extends Applet
implements Runnable, ActionListener {
private static final int EXTERNAL_BUFFER_SIZE = 128000;

Image image[] = new Imag...続きを読む

Aベストアンサー

「シンボルを見つけられません。」というエラーの下に何か表示がありませんでしたか?そこにヒントがあると考えられます。
シンボルを見つけられませんといエラーが表示される主な理由は4つあります。
(1)クラス、メソッド、変数などの綴りミスや定義していない変数を使用している可能性がある。
(2)コンストラクタを呼び出すときに、newを忘れている可能性がある。(3)公開されていないメンバーを呼び出している可能性がある。
(4)必要なimport文を記述し忘れている可能性がある。
ここでのあなたのエラーは(1)番ではないでしょうか?上記ではimageとなっている変数がimgになっていますね。
これはエラー表示をよく見ることで意外と簡単に解決できるのです。
ゆっくり丁寧にエラー表示を見るように心がけることが大事ですよ。

Q文字列から数字を取り出す方法

質問があります。
例えば、テキストファイルから文章を一行ずつ読み込み、それをString型の変数に格納していきます。
その文から数字(整数で、何桁かはわからない。)を取り出し(ちなみにその数字の前後には特定の文字がついています)、変数に格納するというプログラムを作りたいのですが、具体的な方法がわかりません。
よろしければ是非教えてください!

Aベストアンサー

こんな感じですか?
数値以外を除きそのまま代入させます

String str = "ABCDABCD1234512345abcd";
int ret = Integer.parseInt(str.replaceAll("[^0-9]",""));
System.out.println(ret); //結果表示

QArrayListを使った多次元配列の作成について

ArrayListで可変長配列を扱っているのですが、
2次元可変長配列を用いる必要が出てきたので、
下記のように変更したのですがうまくいきません。
何が悪いのか教えていただけませんでしょうか?

-----------------------------------------
ArrayList cars=new ArrayList();
cars.add("フェラーリ");
cars.add("ポルシェ");
cars.add("メルセデスベンツ");
for(int i=0;i<cars.size();i++){
 String str=(String)cars.get(i);
 System.out.println(str);}
-----------------------------------------
上記から下記のように変更しました。
-----------------------------------------
ArrayList[] cars=new ArrayList[3];
cars[0].add("フェラーリ");
cars[0].add("ポルシェ");
cars[0].add("メルセデスベンツ");
for(int i=0;i<cars[0].size();i++){
 String str=(String)cars[0].get(i);
 System.out.println(str);}
-----------------------------------------
エラーは「Exception in thread "main" java.lang.NullPointerException」です。
どうやら初期配列が10ではなく3となってしまっているようです。

ArrayListで可変長配列を扱っているのですが、
2次元可変長配列を用いる必要が出てきたので、
下記のように変更したのですがうまくいきません。
何が悪いのか教えていただけませんでしょうか?

-----------------------------------------
ArrayList cars=new ArrayList();
cars.add("フェラーリ");
cars.add("ポルシェ");
cars.add("メルセデスベンツ");
for(int i=0;i<cars.size();i++){
 String str=(String)cars.get(i);
 System.out.println(str);}
---------------------------------------...続きを読む

Aベストアンサー

こんにちは。

>ArrayList[] cars=new ArrayList[3];
はArrayList型のオブジェクトのインスタンス
を格納する箱を3個作成しただけなので、
この時点では、
cars[0] = null
cars[1] = null
cars[2] = null
となっています。ですから、当然
cars[0].add("フェラーリ");
などとやると、NullPointerExceptionが
発生します。これをさけるには、
cars[0] = new ArrayList();
cars[1] = new ArrayList();
cars[2] = new ArrayList();
とする必要があります。

QIOException ってどういうときに起こるのでしょうか?

IOException ってどういうときに起こるのでしょうか?

http://www.atmarkit.co.jp/fjava/rensai2/javaent12/javaent12.html
を見て勉強しています。

  catch ( IOException e) {
    System.out.println( "キーボードが故障しているのかもしれません" );
  }

と書いてあります。
ハード(キーボード)が故障しているのを Java のプログラムのレベル(ソフトウェア)で感知できるというのがよくわかりません。「

NumberFormatException の方はわかるのですが・・・

Aベストアンサー

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接続だったりするわけですけど、
InputStreamは、その入力元の情報を持っていないので、
データを読み取る際は常に
IOExceptionをキャッチするコードを書かなくてはいけません。
たとえ、絶対にIOエラーが発生しないストリームだとしても。

さらに付け加えるなら、
そもそも「標準入力=キーボード」であるとは限りません。
(一般的にはキーボードであることが多いですが。)
Javaでは、
System.setIn(InputStream)
を呼び出して、標準入力を変えてしまうことができますし、
標準入力を指定してプログラムを実行することができるOSもあります。

追伸1:
例外をキャッチしたときは、
スタックトレースをプリントすることをおすすめします。
catch (IOException e) {
e.printStackTrace();
}

追伸2:
そのプログラムでIOExceptionを発生させる最も簡単な方法は、
readLine()を呼び出す前に
標準入力(System.in)を閉じてしまうことです。
System.in.close();

現実的には、キーボードからの入力でIOExceptionが発生することは、
ほとんどあり得ないと思います。
そもそも、キーボードが故障していたとしても、
IOExceptionは投げられないでしょう。
「キーボードが故障しているのかもしれません」というのは、
その記事の著者が冗談で書いたのだと思います。

ではなぜ、try-catchを書かなくてはいけないのか?
InputStreamやBufferedReaderは、
データ入力を抽象化したものだからです。
実際の入力元はキーボードだったり、ファイルだったり、
ネットワーク接...続きを読む

Qデータ数をカウントしたいのですが

JAVAのJDBCを使いMySqlを操作しデータ数を取得するプログラムです。自分なりに考えたプログラムは
Connection con = null;
String sql = "select count(*) from テーブル名";

// コネクションを作成する。
con = DriverManager.getConnection(url, user, pass);
Statement st = con.createStatement();

// SQLを実行する。
ResultSet rs = st.executeQuery(sql);
String count = rs.getString("count(*)");

実行した結果上手く出来ないのですが、この部分での間違いはありますか?

Aベストアンサー

どう上手くいかないのかエラーメッセージなどがあると分かりやすいのですが・・・とりあえず、count(*)というカラム名は取得できなかったと思います。

sqlを
select count(*) as cnt from テーブル名
にして、

値を取得する部分を
String coung = rs.getString("cnt");
にしてみてください。
もしくはsqlはそのままで、
rs.getString(1)
で1番目のカラムが取得できます。
(カラム名が固定なら最初のやりかたの方が分かりやすいと思います。)

QStringの文字列をString[]配列に変換したい

お世話になります♪

たとえばこういうStringの文字列があるとします。
String s = "私は Javaを 勉強 しています。";
これを下記のようなイメージでString[]配列に変換したいのですが、
{"私は","Javaを","勉強","しています。"};

何かいい方法はないでしょうか?
ヒントをください!

よろしくお願いします。

Aベストアンサー

java.util.StringTokenizerで区切り文字を半角スペースで使用して、
hasMoreTokens()をwhileで回しながらそのループ中で配列に投入してはどうですか?

QJavaで改行などが出来ないのです。

 Java の事で質問です。 
 

 System.out.println("このようにしても\n");

 改行できません。
 
 このようにしても\n   

 と表示されてしまいます。どうしてでしょう。ちなみにOSはMacOS9.1です。なにか関係があるのでしょうか?

Aベストアンサー

> class amigo{
> public static void main(String args[]) {
> System.out.print("aaaaaaaa");
> System.getProperty("line.separator");
> System.out.print("bbbbbbbb");
> }
> }
> のような使い方でしょうか?

String line_sep = System.getProperty("line.separator");
System.out.println("あいうえお" + line_sep + "かきくけこ");

こうです。

Q配列の中に複数存在する数がいくつあるか

お世話になります。配列の中に同じ数が存在する数がいくつあるかを調べたいのですが、途中でつまづいてしまいました。

例えば配列arrayの中に、0, 0, 5, 0, 5, 1, 5といった数が格納されているとしたら
複数ある数は0と5の2つなので、2を返す、というだけのプログラムです。

int n=array.length;
int cnt=0;
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(array[i]==array[j]){
cnt++;
break;
}
}
}
return cnt;

forループで配列0から同じ数を順番に調べ、もしヒットすればカウントを増やして内側のループをブレイクし、配列1からまた順番に調べようとしたのですが、
上の例の場合、配列0と配列1が同じ数(0)ですので、カウントが余計に増えてしまいます。
どのように組めばうまく動作するでしょうか。宜しくお願いします。

Aベストアンサー

>ソートしたあとでも同じ数が連続してしまうので、どのようにしてカウントすればいいのでしょうか・・・

int cnt = 0;
int t = 0; //現在調べている数値が最初に出てくる位置
for( int i = 1 ; i < n ; i ++ ) {
if( array[t] != array[i] ) {
//今までと違う数値になった
if ( i > t +1) {
//次の数値の先頭(i)のが、現在の数値の先頭の隣(t+1)より大きかったら
//現在の数値は2つ以上あったということ
cnt ++ ;
}
//次からは、iの位置を先頭として調べる
t = i;
}
}

//配列の最後に重複があっても(array[t] != array[i])で判定ができないので
//ループの外で判定する
if ( n > t + 1) {
cnt ++ ;
}

QJavaで文字列をゼロ埋め(ゼロパディング)

Javaで文字列を前ゼロで埋め(ゼロパディング)たいのですが、
exceptionが発生してうまくいきません。
だれかお助け頂けたら助かります。

(例)123の前に0を5つ結合したい場合、

String str2="123";
String str = String.format("%08s",str2);

で問題無いと思ったのですが、
exceptionが発生してしまいます。

回答お待ちしております。

Aベストアンサー

そのExceptionはどういったExceptionなのか把握されてますか?
何が悪いのかの理由もそのExceptionからわかると思いますが。

http://docs.oracle.com/javase/jp/6/api/java/util/Formatter.html#syntax
をよく読んで"%08s"という指定ができるのかどうか確認しましょう。

やられたいことは"123"の先頭に"00000000"をつけて後ろから8文字取り出せばできると思いますが。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング