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

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

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

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

Q&A

解決済

2回答

1206閲覧

キューを使ったコード

8Hachikou8

総合スコア3

Java

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

0グッド

0クリップ

投稿2021/10/08 10:41

編集2021/10/08 11:24

[]に文字を入れるためにaddを使っていれようとしているのですが、実行しても[]になにも値が入りません。[]にwordを入れるにはどこを修正すべきでしょうか。
boolean add がtrueになったら[]に値がはいるという意味ではないのでしょうか

現状の実行結果
add 'Java'
=> []
add 'Python'
=> []
add ''
=> []
add ''
=> []
add 'JavaScript'
=> []
add 'Go'
=> []
add 'Swift'
=> []
add 'Go'
=> []
add 'Rust'
=> []

実行したいもの
add 'Java'
=> [Java]
add 'Python'
=> [Java, Python]
add ''
add ''
add 'JavaScript'
=> [Java, Python, JavaScript]
add 'Go'
=> [Python, JavaScript, Go]
add 'Swift'
=> [JavaScript, Go, Swift]
add 'Go'
=> [JavaScript, Swift, Go]
add 'Rust'
=> [Swift, Go, Rust]

java

1コード 2package ex5; 3 4import java.util.ArrayDeque; 5import java.util.Queue; 6 7public class SearchHistory extends ArrayDeque<String> { 8 private int maxSize; 9 10 public SearchHistory(int maxSize) { 11 // TODO: 初期化 12 this.maxSize=maxSize; 13 } 14 15 /** 16 * word を追加する。空文字の場合は追加しない。 17 * すでに入っていた文字は入れ直す。 18 * maxSize を超えた分古いデータは削除 19 * 20 * @param word 21 * @return 追加したか否か 22 */ 23 @Override 24 public boolean add(String word) { 25 // TODO: 空文字は保存せず false を返す 26 if (equals("")) { 27 return false; 28 } else { 29 // TODO: すでに入っている文字は入れ直す 30 if (contains(word)) { 31 //削除メソッド 32 remove(word); 33 //最後に追加 34 addLast(word); 35             //addにtrueを返す 36 return true; 37 } 38 // TODO: maxSize を超えた分古いデータは削除 39 if (size()>=maxSize) { 40 remove((queue[0])); 41 addLast(word); 42 } 43 return true; 44 } 45 } 46 47 public static void main(String[] args) { 48 Queue<String> queue = new SearchHistory(3); 49 String[] orders = new String[]{"Java", "Python", "", "", "JavaScript", "Go", "Swift", "Go", "Rust"}; 50 for (String s : orders) { 51 boolean added = queue.add(s); 52 System.out.println("add '" + s + "'"); 53 if (added) { 54 System.out.println(" => " + queue); 55 } 56 } 57 } 58}

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

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

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

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

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

BeatStar

2021/10/08 11:30

修正を確認しました。 ですが、まだ違うところがあります。 「addにtrueを返す」(return trueを指して) まったく違います。addメソッドに返してどうするんですか。再帰メソッドじゃあるまいし。 こういう、応用をやるよりも先に基礎からやったほうがいいですよ。 仮に基礎をすっ飛ばしてもどのみち基礎をやることになりますし、回答者も無駄な時間を使います。 (AのためにBを教えたら「Bって何?」、BのためにCを教えたら「Cって何?」……と無駄な時間を使う羽目になる)
TN8001

2021/10/08 11:50

EclipseだとかIntelliJ IDEAとかのIDE(統合開発環境)は、お使いじゃないんでしょうか? IDEであれば文法エラーもその場でわかります。 頭の中で順にコードを読み進める?のが苦手なら、IDEで実際に1行ずつ実行していく(ステップ実行)機能もあります。 インストールやJavaを使えるようにする設定・IDE自体の使い方を覚える等々の手間を差し引いても大きなメリットがありますので、もし使っていないのであれば今すぐ調べてください。 今後の学習効率に大きな差が出ます(個人的には初心者ほどIDEを使うべきと思います)
8Hachikou8

2021/10/08 11:59

BeatStarさん丁寧に教えて頂きありがとうございます。1つ1つ順番に頭のなかでやっていってあと少しのところまで進めれました。頭の中で考えながら最後まで進めてみます。学ぶべきことも隙間時間に徐々に復讐していきます。 Eclipse使っている,そのIDEというのもののやり方調べてみます。ありがとうございます。
BeatStar

2021/10/08 12:02

意味的にはわかりますが、質問者さん、「復讐」じゃなくて「復習」では? 重箱の隅を楊枝でほじくるようですが、気になったので。
8Hachikou8

2021/10/08 12:09

変換ミスしてました。復習です。
jimbe

2021/10/09 18:56

そもそもと言いますか、SearchHistory クラスは ArrayDeque を継承するのでは無く、 ArrayDeque をフィールドとして持つほうが良いと思います。 ArrayDeque はキューやスタックとしての多数のメソッドが実装されており、継承するとその全てが外から使えることになります。 SearchHistory にそれらが必要でしょうか。外からそれらを使ってデータを操作して良いのでしょうか。 クラス名から察しますと、追加に使用するのは override した add だけでしょうし、後は個々を順に取り出すとかインデックス指定で取り出す、クリアするとか程度でしょう。 それだけなら、 ArrayDeque でさえ必要無くて List やいっそ配列を使うので良いようにも思います。
guest

回答2

0

配列で再現してみました。
といってもオリジナルと違って表示の左(インデックス0)が最後に入れたモノになります。

java

1package teratail_java.q363477; 2 3import java.util.StringJoiner; 4 5public class SearchHistory { 6 private String[] array; // 0 が最後に入れたモノ 7 8 public SearchHistory(int maxSize) { 9 array = new String[maxSize]; 10 } 11 12 /** 13 * word を追加する。null,空文字の場合は追加しない。<br> 14 * すでに入っていた文字は入れ直す。<br> 15 * maxSize を超えた分古いデータは削除 16 * @param word 文字列 17 * @return 追加した場合 true 18 */ 19 public boolean add(String word) { 20 if(word == null || word.isEmpty()) return false; 21 22 int i = indexOf(word); 23 if(i < 0) i = array.length-1; 24 for(int j=i; j>0; j--) array[j] = array[j-1]; // 0 を空けるようにずらす(ついでに要らないのを消す) 25 array[0] = word; 26 return true; 27 } 28 29 private int indexOf(String word) { 30 for(int i=0; i<size(); i++) { 31 if(array[i].equals(word)) return i; 32 } 33 return -1; 34 } 35 36 public int size() { 37 int i = 0; 38 while(i < array.length && array[i] != null) i++; 39 return i; 40 } 41 42 public String get(int index) { 43 if(index < 0 || index >= size()) return null; 44 return array[index]; 45 } 46 47 public void clear() { 48 for(int i=0; i<array.length; i++) array[i] = null; 49 } 50 51 @Override 52 public String toString() { 53 StringJoiner sj = new StringJoiner(",", "[", "]"); 54 for(int i=0; i<size(); i++) sj.add(get(i)); 55 return sj.toString(); 56 } 57 58 public static void main(String[] args) { 59 SearchHistory history = new SearchHistory(3); 60 String[] orders = new String[]{"Java", "Python", "", "", "JavaScript", "Go", "Swift", "Go", "Rust"}; 61 for (String s : orders) { 62 boolean added = history.add(s); 63 System.out.println("add '" + s + "'="+added); 64 System.out.println(" => " + history); 65 } 66 } 67}

実行結果

plain

1add 'Java'=true 2 => [Java] 3add 'Python'=true 4 => [Python,Java] 5add ''=false 6 => [Python,Java] 7add ''=false 8 => [Python,Java] 9add 'JavaScript'=true 10 => [JavaScript,Python,Java] 11add 'Go'=true 12 => [Go,JavaScript,Python] 13add 'Swift'=true 14 => [Swift,Go,JavaScript] 15add 'Go'=true 16 => [Go,Swift,JavaScript] 17add 'Rust'=true 18 => [Rust,Go,Swift]

投稿2021/10/10 15:30

jimbe

総合スコア13209

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

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

0

ベストアンサー

それはそうだろ……

前回の私の回答ちゃんと読んでください
別に私の回答じゃなくてもいいですが、とにかく説明しているやつを読んでください。

プログラミングは「闇雲に書けばいい」ってものではありません。
ロジックを記述するのです。

現実世界のシミュレーションです。

繰り返しますが、「コードを読みましょう」。

とりあえず、mainメソッドから読みましょう。

Java

1 public static void main(String[] args) { 2 // 生成! 3 Queue<String> queue = new SearchHistory(3); 4 // なんらかの文字列を配列として定義(宣言) 5 String[] orders = new String[]{"Java", "Python", "", "", "JavaScript", "Go", "Swift", "Go", "Rust"}; 6 7 // 配列の要素数分ループ 8 for (String s : orders) { 9 // 現在のsの値をaddメソッドに渡してキューに追加 10 boolean added = queue.add(s); 11 // 追加できたかどうかを表示 12 System.out.println("add '" + s + "'"); 13 // 追加できたら、 14 if (added) { 15 // キュー内にあるデータを出力 16 System.out.println(" => " + queue); 17 } 18 } 19 }

で、何となくaddメソッドが怪しいです。なのでaddメソッドも同様に潜る。

Java

1 // オーバーライドする 2 @Override 3 public boolean add(String word){ 4 // 空文字は保存せず false を返す 5 if (equals("")) { 6 return false; 7 // それ以外で 8 } else { 9 // すでにセットされているのなら 10 if (contains(word)) { 11 // キューから取り除いて 12 remove(word); 13 // 末尾に追加 14 addLast(word); 15 // メソッドから抜ける 16 return true; 17 } 18 // サイズが超過したら 19 if (size()>=maxSize) { 20 // キューの先端を削除する 21 remove((queue[0])); 22 // そんで追加する 23 addLast(word); 24 } 25 // メソッドから抜ける 26 return true; 27 } 28 }

↓ ↓ ↓ ↓ ↓

0. 引数: word 1. wordが空なら 1.1. 何もせずfalseを返して終了 2. それ以外(= wordに何か入っている)なら 2.1. なおかつすでにwordがセットされているのなら 2.1.1. キューから削除して 2.1.2. 末尾に追加 2.1.3. 終了!!! 2.2. サイズが超過したら 2.2.1. キューの先端を削除 2.2.2. 末尾に追加 2.3. 終了!!!

これを現実世界でシミュレーションしてください。実際に値を入れて計算してください。

mainメソッド内で、

データ群 = { "Java", "Python", "", "", "JavaScript", "Go", "Swift", "Go", "Rust" }

となっています。

最初のデータは"Java"ですね。

まずはこのデータ "Java" を addメソッドに渡してみましょう。

(0)で word: "Java" となります。そのまま (1)に行きますが、空ではないので条件を満たしません。よって(2)に行きます。

で、(2)では elseなのでほぼ強制的に(2.1)へ。

で、(2.1)でもまだセットされていませんから、条件を満たしていません。
よって処理せずに(2.2)へ。

(2.2)では「サイズが超過したら」となっていますが、まだキューの中身は空なので「サイズが超過したら」もなにもないでしょ。よって条件を満たさないので(2.3)へ。

(2.3)では処理が完了しているものとしてメソッドから抜けます。

……あれ? 最初の"Java"はまだキューに無いので追加されるべきですよね?
でも追加する処理がありません。

処理自体はありますが、条件を満たしていないため処理されずにいます。よってキューの中身は空の状態です。

そして、二つ目の"Python"も同様に、追加処理が無い為、まだキューの中身は空です。

…とやりますが、八個目の"Go"は確かにデータ群では重複していますが、この時点でもまだキューが空なので重複しているかどうかとか関係ありません。ない袖は振れない。

よって、いつまで経っても空のまま。

この考え方が出来れば普通にコーディングできるはずですがね。


[追記1]

[質問者さんが(最低でも)学ぶべきこと] ■ メソッドとは ■ 引数 ■ 戻り値 ■ コードを読むこと ■ プログラミングとは ■ デバッグ方法 ■ アルゴリズムの考え方

ちなみに、上記の「コードを読む」のやつはデバッガで潜ったりすることに通じますよ。


[追記2]

boolean add がtrueになったら[]に値がはいるという意味ではないのでしょうか

いや、どこからそんな発想が出てきた……
return true とかは単純にメソッドから抜けるだけですよ。(それと戻り値を返すこと)

そもそも基礎自体を無視しているでしょ? そうじゃなければあり得ないことを言っていますよ。

「自販機の前に、財布を出したんですが、なぜか飲み物が出てきません。財布出すだけで飲み物が出るんですよね?」みたいな頓珍漢な質問です。

まずは基礎からやりましょう。

投稿2021/10/08 11:26

編集2021/10/08 11:42
BeatStar

総合スコア4962

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

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

kaina

2021/10/08 11:47

頭の中で流れを整理できなければ、シーケンス図作って流れを整理すると良いかもしれませんね。 まあ、行き当たりばったりでプログラムを作るのではなくプログラムを作る前に 作るべきですが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問