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

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

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

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

Q&A

解決済

2回答

2619閲覧

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

aiue

総合スコア36

Java

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

0グッド

0クリップ

投稿2017/05/05 09:06

編集2017/05/05 09:48

表題の通りです。
例えば「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つです。あと、質問画面でインデントが入れられないのですが…

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

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

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

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

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

swordone

2017/05/05 09:57

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

2017/05/05 11:22

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

2017/05/05 12:32

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

2017/05/05 12:33

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

回答2

0

ベストアンサー

java

1public class Main { 2 3 public static void main(String[] args) { 4 System.out.println(dog("dogddg")); 5 System.out.println(dog("dgodgo")); 6 System.out.println(dog("ddogodogg")); 7 } 8 9 private static int dog(String text) { 10 int result = Integer.MAX_VALUE; 11 for (String s : new String[] {"d", "o", "g"}) { 12 int count = text.length() - text.replace(s, "").length(); 13 result = Math.min(result, count); 14 } 15 return result; 16 } 17}

実行結果

1 2 3

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


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

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

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

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

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

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

投稿2017/05/05 10:41

KiyoshiMotoki

総合スコア4791

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

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

aiue

2017/05/05 12:34

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

0

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

java

1static int Dog(String[] str){ 2 //これはフィールドではなく、ローカル変数 3 int dog=0; 4 5 for(int i=0;i<str.length;i++){ 6 if(str[i].equals("d")){ 7 str[i]="-"; 8 for(int j=0;j<str.length;j++){ 9 if(str[j].equals("o")){ 10 str[j]="-"; 11 for(int k=0;k<str.length;k++){ 12 if(str[k].equals("g")){ 13 str[k]="-"; 14 dog++; 15 break; 16 } 17 } 18 } 19 } 20 } 21 } 22 return dog; 23}

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


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

java

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

投稿2017/05/05 09:14

編集2017/05/05 12:54
swordone

総合スコア20651

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

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

aiue

2017/05/05 09:29

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

2017/05/06 01:28

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問