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

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

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

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

Q&A

解決済

2回答

557閲覧

特定の文字列を繰り返し表示をし、特定の順番になったら処理を終了させる関数

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

0クリップ

投稿2020/05/12 05:48

編集2020/05/12 06:05

"a","b","c",という文字列があったとして、
Random()を使用しランダムに文字列を表示し、"a","c","b","c"の並び順になったら処理を終了させる関数を作りたいのですが、どのような処理を書けば良いかわかりません。
回答の方宜しくお願いいたします。

//まだ関数に直していません。動くかチェックしてます。 import java.util.Random; class Moziretu{ public static void main(String[] args) { String[] mozi = {"a","b","c"}; Random r = new Random(); for(int i=0 ; i<1000; i++) { if(mozi[r.nextInt(3)]=="a"+"c"+"b"+"c"){ String mozis = mozi[r.nextInt(3)]; System.out.println(mozis); break; } } } }

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

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

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

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

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

y_waiwai

2020/05/12 05:52

わかりませんと丸投げされても回答しようがないです。 まずはあなたなりにコードを書いてみてそれを提示しましょう
退会済みユーザー

退会済みユーザー

2020/05/12 06:02

すみません。直しましたので宜しくお願いいたします。
momon-ga

2020/05/12 06:15

> Random()を使用しランダムに文字列を表示 というのは、今回の場合かならず4文字の文字列を作成するのですか? それとも特定文字列が出るまで連結(1000文字?)して、末尾の4文字を利用する感じですか?
退会済みユーザー

退会済みユーザー

2020/05/12 06:21

配列の中の文字を出力し続けて、回数は問いません(仮で1000としていました。)、出力し続け、文字が"a","c","b","c"の順番に出力され処理がストップすれば完了です。文字の連結はしません。 お手数おかけします。
momon-ga

2020/05/12 06:31

”順番に出力され”が、よくわからないのですが。 仮に、”a","a","c","b"と出力されたあとに"c"と出力した場合は、末尾が"a","c","b","c"なので終了条件を満たすという理解でよい? ”a","a","c","b"と出力されたあと、前の文字関係なく、”c","c","d","c"みたいな連続した4文字を出力しますか? という意味の質問です。
退会済みユーザー

退会済みユーザー

2020/05/12 06:36

認識違いでした、すいません。 >a","a","c","b"と出力されたあとに"c"と出力した場合は、末尾が"a","c","b","c"なので終了条件を満たすという理解でよい? ↑こちらの理解でよろしいです。
guest

回答2

0

ベストアンサー

現状のソースの問題点です。

java

1if(mozi[r.nextInt(3)]=="a"+"c"+"b"+"c"){

このifがtrueになることはありません。
理由は2つ。
0. 文字列の比較は==でなく、equalsメソッドを使う必要がある
0. mozi[r.nextInt(3)] は、1文字を取得しますが比較対象は4文字"acbc"である

というわけで、文字列を連結して最後の4文字を確認すればよいです。
必ず4文字にするか、無視して1000文字とか大きくなるのを許容するかは好みかな
3種類4文字なら81通りだから、まぁ割と高い頻度で一致すると思います。

文字列連結は、+演算子を使うかStringBuilder#appendを使えばよいです。

最後の4文字の比較は、String#lastIndexOfというのがあります。


あらら退会しちゃいましたか。
元のソースっぽくやるなら以下みたいなのを想定していたのだろうかと。

java

1int pos = 0; 2String[] ans = {"a","c","b","c"}; 3String[] mozi = {"a","b","c"}; 4Random r = new Random(); 5for(int i=0 ; i<1000; i++) { 6 String s = mozi[r.nextInt(3)]; 7 System.out.println(s); 8 if(s.equals(ans[pos])) { // s と ans をcharにすれば== 比較ができる 9 pos++; // ansの確認を a -> c -> b -> c という風にずらしていく 10 if(pos == ans.length) break; // 最後まで一致したらループ終了 11 } else { 12 pos = 0; // 最初からやりなおし 13 } 14}

以下コメント

そのやり方では、乱数が

a c b a c b c a c b c a b
のような列を生成した時、最初の a c b c を検出できず、
2つ目の a c b c で終了します。

その通りです。
単純にposを0にするのがダメですが、直すのは面倒なのでこのまま放置。

投稿2020/05/12 06:49

編集2020/05/14 01:11
momon-ga

総合スコア4826

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

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

退会済みユーザー

退会済みユーザー

2020/05/12 08:05

無事解決いたしました。ありがとうございました。
kazuma-s

2020/05/13 12:52

そのやり方では、乱数が a c b a c b c a c b c a b のような列を生成した時、最初の a c b c を検出できず、 2つ目の a c b c で終了します。
momon-ga

2020/05/14 01:08

あ、たしかに。ansに同じ文字が含まれてると、誤動作しますね。 ansがababcで、abababcもダメっすね。
guest

0

文字列連結には + を使ったのですか。それとも StringBuilder?
解決したのなら、そのコードを見せてください。

文字連結を使わないやり方なら、

Java

1import java.util.Random; 2 3class Main { 4 public static void main(String[] args) { 5 Random r = new Random(); 6 for (int a = 0xffff, i = 0; i < 1000 && a != 0x0212; i++) { 7 int b = r.nextInt(3); 8 System.out.print(" " + (char)('a' + b)); 9 a = (a << 4 | b) & 0xffff; 10 } 11 } 12}

投稿2020/05/12 11:12

kazuma-s

総合スコア8224

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問