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

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

ただいまの
回答率

88.81%

Java 与えられた文字列の中に特定の文字列がいくつあるか数えたいです

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 14K+

aiue

score 36

表題の通りです。
例えば「dogddg」という文字列が与えられた場合、「dog」がいくつあるか数えるプログラムを作りたいです。(例なら”1”を出力)

//作成したコード(簡略版)
static int Dog(String[] str){
//フィールド
int dog=0;

for(int i=0;i<str.length;i++){
if(str[i].equals("d")){
str[i]="-";
for(int j=0;j<str.length;j++){
if(str[j].equals("o")){
str[j]="-";
for(int k=0;k<str.length;k++){
if(str[k].equals("g")){
str[k]="-";
dog++;
break;
}
}
}
}
}
}
return dog;
}

このようなメソッドを作成してみたのですが、最後のbreakで抜けると1つ目のループではなく2つ目のループが始まってしまい(本当にそうなのかは分かりません)、上手く出来ません。宜しくお願い致します。
※追記
聞き方が悪かったです。
「dgodgo」という文字列の中に”dog”はいくつあるのか数えるプログラムです。この例なら2つです。あと、質問画面でインデントが入れられないのですが…

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • swordone

    2017/05/05 18:57

    質問編集画面でコードの部分を反転選択し、<code>ボタンを押してください。

    キャンセル

  • koko_u

    2017/05/05 20:22

    追記されている例でdogをのように2つとカウントしているのかわかりません。このような曖昧な仕様と謎のコードだけ引き継がれることは、現実世界でもしばしばありますが...

    キャンセル

  • aiue

    2017/05/05 21:32

    @koku_uさん 「dgodgo」を並び替えて「dogdog」として、2つ”dog”がありますよね、という意味です。伝わりましたでしょうか、下手な質問ですみません。

    キャンセル

  • aiue

    2017/05/05 21:33

    @swordoneさん ありがとうございます。

    キャンセル

回答 2

checkベストアンサー

+2

public class Main {

    public static void main(String[] args) {
        System.out.println(dog("dogddg"));
        System.out.println(dog("dgodgo"));
        System.out.println(dog("ddogodogg"));
    }

    private static int dog(String text) {
        int result = Integer.MAX_VALUE;
        for (String s : new String[] {"d", "o", "g"}) {
            int count = text.length() - text.replace(s, "").length();
            result = Math.min(result, count);
        }
        return result;
    }
}


実行結果

1
2
3


ただし、goodのように同じ文字が2回以上 現れる単語を検索する場合は、
もう一工夫が必要です。


あと、質問画面でインデントが入れられないのですが…

質問投稿画面の左上にある<code>というボタンをクリックすると、
テキストエリアに

```ここに言語を入力  
コード  
``'

というブロックが追加されます。

このブロックの「コード」という部分を質問したいソースコードに、 「ここに言語を入力」という部分をそのソースコードの言語名(例えば、java)に置き換えてください。

さらに詳しい使い方は、画面左下のMarkdown記法とはというリンクをクリックしたり、
以下のリンクなどを参考にしてください。
https://teratail.com/tour
https://teratail.com/help/question-tips#questionTips3-3-1

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/05 21:34

    何から何まですみません。ありがとうございました。教えていただいたコードを参考に進めてみます。

    キャンセル

+1

いろいろおかしなことをやっているコードですね…
まず、仮に"dogddg"という「文字列」が与えられたのなら、これは配列ではなく1個のStringです。
強いてあげればchar型の配列ですが、その場合はまた使い方が異なります。
そもそも、コードを書くときはマークダウンして、インデントを入れてください。

static int Dog(String[] str){ 
    //これはフィールドではなく、ローカル変数
    int dog=0;

    for(int i=0;i<str.length;i++){ 
        if(str[i].equals("d")){ 
            str[i]="-"; 
            for(int j=0;j<str.length;j++){ 
                if(str[j].equals("o")){ 
                    str[j]="-"; 
                    for(int k=0;k<str.length;k++){ 
                        if(str[k].equals("g")){ 
                            str[k]="-"; 
                            dog++; 
                            break; 
                        } 
                    } 
                } 
            } 
        } 
    } 
    return dog; 
}

で、この場合はStringクラスのメソッドindexOfを繰り返し使うのが正攻法です。


並び替えを考慮するのであれば、それぞれの文字の個数さえわかればいいので、

//"dog"に限らずいろいろ適用できるように、探す文字列も引数にとって書いてみる
static int count(String str, String target) {
    Map<Character, Integer> charCount = new HashMap<>(),
                            targetCount = new HashMap<>();
    for (char c : str.toCharArray()) {
        charCount.marge(c, 1, Integer::sum);
    }
    for (char c : target.toCharArray()) {
        targetCount.marge(c, 1, Integer::sum);
    }
    // strの中にtargetに使われている文字をそれぞれ何セット分取り出せるか計算し、その最小値をとる
    return targetCount.entrySet().stream().mapToInt(e -> charCount.getOrDefault(e.getKey(), 0) / e.getValue()).min().getAsInt();
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/05 18:29

    コードの書き方はこれから気を付けます、ありがとうございました。

    キャンセル

  • 2017/05/06 10:28

    追記いただきありがとうございます。

    キャンセル

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

  • ただいまの回答率 88.81%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る