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

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

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

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

Q&A

解決済

1回答

874閲覧

模範解答に出てくるコードの意味が理解できません

ypk

総合スコア83

Java

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

0グッド

0クリップ

投稿2020/05/17 13:35

初めまして。
Javaの学習をしているものです。

先日、研修にて「正確さ重視の練習」 を行える機能を持たせたキータッチトレーニングができるものを作成しましたが、私は「正確さ重視の練習」ができる機能を実装できませんでした。正確さ重視の練習とは、入力されたデータと KTT 文字列を比較し、間違いがないか分析する機能です。

最終的には、模範解答にて理解しようと考えたのですが、模範解答にて理解できない箇所がございましたので質問します。
調べても出てこず、困っております。

ご教授いただけたら幸いです。どうぞよろしくお願いいたします。

#模範解答

Java

1import java.util.Scanner; 2 3public class Ktt14 { 4 public static void main(String[] args) { 5 6 System.out.println("キータッチ・トレーニングを始めましょう。"); 7 System.out.println(); 8 9 String[][] kttModelArray = new String[2][]; 10 String[] kttModel = { "deed did feed freed red deer", "freed red deer did ride free" }; 11 12 // スピードメソッドの呼び出し 13 speed(kttModel); 14 15 // 正確さメソッドの呼び出し 16 currect(kttModel); 17 18 } 19 20 public static void speed(String kttModel[]) { 21 22 System.out.println("スピード・トレーニングを始めましょう。"); 23 System.out.println(); 24 25 Scanner scan = new Scanner(System.in); 26 27 final int COUNT_LIMIT = 5; 28 29 // スピードトレーニングを5回行うための繰り返し処理 30 for (int i = 0; i < COUNT_LIMIT; i++) { 31 32 // 処理前の時刻を取得 33 long startTime = System.currentTimeMillis(); 34 35 for (int j = 0; j < 2; j++) { 36 37 // スピードトレーニングの見本を表示 38 System.out.println(kttModel[j]); 39 40 // 文字の入力 41 String input = scan.nextLine(); 42 43 // 改行 44 System.out.println(); 45 46 // 処理後の時刻を取得 47 long endTime = System.currentTimeMillis(); 48 49 long time = ((endTime - startTime) / 1000); 50 51 // タイピング時間によってコメントの変更 52 if (time <= 20) { 53 System.out.println("処理時間:" + time + "s" + " " + "すばらしい!"); 54 } else if (time >= 40) { 55 System.out.println("処理時間:" + time + "s" + " " + "がんばって!"); 56 } else { 57 System.out.println("処理時間:" + time + "s" + " " + "その調子!"); 58 } 59 60 // 改行 61 System.out.println(); 62 63 } 64 65 } 66 67 } 68 69 public static void currect(String kttModel[]) { 70 71 System.out.println("コレクト・トレーニングを始めましょう。"); 72 System.out.println(); 73 74 Scanner scan = new Scanner(System.in); 75 76 final int COUNT_LIMIT = 3; 77 78 // 正確さトレーニングを3回行うための繰り返し処理 79 for (int i = 0; i < COUNT_LIMIT; i++) { 80 81 for (int j = 0; j < 2; j++) { 82 83 // 正確さトレーニングの見本を表示 84 System.out.println(kttModel[j]); 85 86 // 文字の入力 87 String input = scan.nextLine(); 88 89 String kttModelArray[] = kttModel[j].split("", -1); 90 String inputArray[] = input.split("", -1); 91 92 // エラーの回数を初期化 93 int errorCount = 0; 94 // 1文字ずつ比較 95 for (int k = 0; k < inputArray.length; k++) { 96 97 // KTT文字列の文字数を超えてもエラー扱いにしない 98 if (k == kttModelArray.length - 1) { 99 break; 100 } 101 102 // 等しくなければエラー回数を増やす 103 if (!inputArray[k].equals(kttModelArray[k])) { 104 errorCount++; 105 } 106 107 } 108 109 // 入力文字の数が少ない場合の余分なエラーカウントを減らす 110 if (inputArray.length < kttModelArray.length) { 111 errorCount--; 112 } 113 114 // エラーが発生した場合、回数を出力 115 if (errorCount > 0) { 116 System.out.println("error count = " + errorCount); 117 } 118 119 } 120 // 改行 121 System.out.println(); 122 } 123 124 scan.close(); 125 126 } 127}

#理解ができない箇所

// KTT文字列の文字数を超えてもエラー扱いにしない

if (k == kttModelArray.length - 1) { break; }

模範解答にて、上記のようなコードがあります。これが具体的に何者なのか、どこからこのようなコードが出てきたのか、なぜ-1をすることで「文字列の文字数を超えてもエラー扱いにしない」処理ができるのかがよくわかりません。

どなたかご教授いただけたら幸いです。どうぞよろしくお願いいたします。

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

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

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

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

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

Zuishin

2020/05/17 13:43

これが無いと KTT 文字列の長さを超えてもループが回り続け、エラーが増えます。その前にループを終了させているのです。
ypk

2020/05/17 14:01

ありがとうございます。 >これが無いと KTT 文字列の長さを超えてもループが回り続け、エラーが増えます。その前にループを終了させているのです。 このコードの役割を理解することができました。 「-1」をしている理由は、何なのでしょうか。 例えば、入力した文字が10文字、手本の文字が5文字だとすると5文字分、エラーカウントしない処理が行われると思うのですがその処理を「手本の長さ-1」と「k」を比較することで実現できるのかがまだ納得いっておりません。 お手数をおかけしますが、もう少し詳しく教えてきただけると幸いです。 どうぞよろしくお願いいたします。
Zuishin

2020/05/17 14:04

0 から始まっているからです。10 文字なら 0 から 9 までの 10 文字を比較します。
ypk

2020/05/17 14:05

例えば、kの値が10でkttModelArray.lengthの値が5だとしたら「k=kttModelArray.length」にならずbreakができないと考えてしまいました。
Zuishin

2020/05/17 14:07

k の値は 10 にはなりません。どこまでわかっているかこちらではわからないので聞くんですが、for は知っていますか?
swordone

2020/05/17 14:11 編集

仕様がよくわかりませんねぇ… 最初は「そのifブロックと、次のifブロックが逆なら理解できる」と書こうとしたのですが、そのあとの「入力文字の数が少ない場合の余分なエラーカウントを減らす」というところでよくわからなくなりました。つまりこれは「入力を最後までチェックすると、必ず余分にエラーが出る」ということを示唆していることになります。そうなると、質問のif文で-1していることと併せて考えて、「入力の最後は必ず一致しない文字が入る」という前提の下で書かれているコードのように見えます。 入力の最後に入り、不一致を生み出す文字として真っ先に改行文字が浮かびましたが、nextLineで入力を取ってきている以上、行末の改行文字は取り除かれているはずです。なので、このコード全体の前提がよくわかりません。
swordone

2020/05/17 14:13

Zuishinさん、落ち着いて。 0から9の10文字比較するにしても、このコードは9番目を比較せずに抜けてしまうのです。 ypkさんはそれが疑問だと言っているのだと思います。
ypk

2020/05/17 14:15

このコード自体がちょっとおかしいのでしょうか、、、、 それだとしたら、皆さんにいろいろ考えていただいたりしたのに申し訳ないです、、、
ypk

2020/05/17 14:21

ありがとうございます。 そうですね。例えば、手本の文字の長さが5文字で、自分が入力した文字が10文字だとしたら、6文字目(K-5)はbreakでループを抜けることができても、7文字目、8文字目、9文字目、10文字目はループから抜けることができない(「手本の長さ-1」と「k」が同じ値にならない)のでは?と思いました、、、 これはbreakが一度発動した時点で、for (int k = 0; k < inputArray.length; k++) { から始まるループは抜けることができるという解釈で問題ございませんでしょうか?
Zuishin

2020/05/17 14:21

swordone さん、確かに。等号ですね。
YT0014

2020/05/17 22:39 編集

breakは、ループ処理を終了しますので、kの値が手本の文字数以上になることはありません。 もっとも、最後の文字は絶対に比較しない、という問題が残りますが。 なお、このコードは他にも問題が多々あるかと。 入力が何もない場合、errorCountが-1になってエラーがないことになるとか。 main()に使用されない配列が作成されているとか。 文字列のままcharAt()で実装した方が速度が速いとか。 swordoneさんが指摘している-1の謎とか。
ypk

2020/05/17 23:01

皆さんありがとうございます。 breakについての理解もできました。また、コードについても承知いたしました。charAt()についても勉強してみます。
kaina

2020/05/18 01:36

そもそも会社の研修でやっていて模範解答貰ったのであれば、 会社の研修担当者に聞くべきでは? というか他の質問も同様かと思われます。
guest

回答1

0

自己解決

#問題のコードの役割

if (k == kttModelArray.length - 1) { break; }

はお手本の文字の長さと入力した文字の長さが「手本<入力」の関係になった時にエラーをカウントしないことを目的に記述するコードである。
入力された文字の長さが手本の文字の長さとイコールになった瞬間、処理を停止する。これにより、入力された文字の長さが手本を上回った時にエラーをカウントしてしまうことを防げる。

投稿2020/05/17 23:02

ypk

総合スコア83

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問