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

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

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

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

Q&A

解決済

3回答

941閲覧

Java:これでなんで実行できるの?(while文での問題)

notName

総合スコア4

Java

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

0グッド

1クリップ

投稿2022/11/20 15:25

とある問題集での質問です。

ここに質問の内容を詳しく書いてください。
Javaの勉強中なのですがある程度参考書を進めており練習問題で下記の解答でなんでそうなるのか困っています。do-whileとwhile文の違いについて記述されているのにwhile(j < array[i].length())がどうして問題なく動くのか
その理由が全く分かりません。
お手数ですが教えて下さるとたすかります。

解答結果: A:1 B:1

length()は文字列の長さ lengthは配列の長さと簡単な覚え方ですが①は二次元配列ではないと認識しています。ただ、arrary[i].length()の意味を踏まえ、2つ目のwhile文の終わりどころがわかりません。

私の中では
「 j < array[i].length() 」-> 「 j < array[0].文字列 1 」-> jが要素番号と文字列より小さいなら⁇
という風になっておりそこから??となっています

知りたい事
1.while(j < array[i].length())の意味
2.length()無視してarrary[i]だけをみていいのか(その場合の理由も知りたいです)

実現したいこと

ここに実現したいことを箇条書きで書いてください。

  • ▲▲機能を動作するようにする

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

Java ソースコード public class Main { public static void main(String[] args) { String[] array = {"A","B"}; int i = 0; while(i < array.length) { int j = 0; do { ++j; }while(j < array[i].length()); //① System.out.println(array[i] + ":" + j); i++; } } } ### 試したこと ここに問題に対して試したことを記載してください。 ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。

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

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

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

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

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

jimbe

2022/11/20 16:15

>①は二次元配列ではないと認識 ①とは何でしょう。
guest

回答3

0

ベストアンサー

「 j < array[i].length() 」-> 「 j < array[0].文字列 1 」-> jが要素番号と文字列より小さいなら⁇
という風になっておりそこから??

j < array[i].length()jarray[i].length() の比較です。
(右辺左辺とも 1 つの値同士の比較であり、一方・両方が複数の値同士を直接比較する演算子は java にはありません。)

array[i].length() は、 配列からのオブジェクトの取り出し(array[i]) とそのオブジェクトのメソッドの呼び出し (.length()) に分かれます。

数学で "x を使った式に x の具体的な値を入れて計算する" のと同じようにしてみましょう。
String[] array = {"A", …} で i が 0 の時、 array[i] は array[0] ということで、array[0] は "A" です。
array[0].length() というのは "A".length() ということになり、 String 型の length() は文字列の長さを返します から 1 、 array[i].length() の結果は 1 ということになります。
これと j と比較する式 j < array[i].length() は、jが 1 だったとすると最終的には 1 < 1 となり、結果は (boolean の ) false となります。

array の中身の長さが同じだと分かり難いので String[] array = {"A","BB"}、 i=1 だったとしますと、
array[i].length() → array[1].length() → "BB".length() → 2
j=1 なら
j < array[i].length() → 1 < 2true
となります。

また int len = array[i].length();

java

1String str = array[i]; //配列からのオブジェクトの取り出し: str は "A" とか "B" とかになる 2int len = str.length(); //オブジェクトのメソッドの呼び出し: len は "A" とか "B" とかの長さになる

という 2 行を同じ、という説明も見られる/たと思います。
ですが、 len だけが欲しいなら str は(無くて済むなら)無いほうが良いですし、どうにしろ while の () の中には 2 行は入れられないので 1 行の書き方をしている…という考え方も出来るかもしれません。

投稿2022/11/20 16:31

編集2022/11/21 05:26
jimbe

総合スコア12545

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

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

notName

2022/11/21 02:28

とてもわかりやすい内容だったので改めて解いた時すんなり解けました
jimbe

2022/11/21 05:59

"." で繋がっているモノは、幾つ繋がっていても左から順に当てはめていけば分かります。 bookcases[i].shelves[j].books[k].title.indexOf("艦これ") >= 0 は 本棚の配列の i 番の本棚内の、棚の配列の j 番の棚内の、本の配列の k 番の本の、タイトル(String)の、指定文字列("艦これ")があったら0以上を返すメソッド、が 0 以上だったら true という感じです。
guest

0

length()は文字列の長さ lengthは配列の長さと簡単な覚え方ですが①は二次元配列ではないと認識しています。ただ、arrary[i].length()の意味を踏まえ、2つ目のwhile文の終わりどころがわかりません。

配列arrayの中身はなんでしょうか? コード上ではString[] array = {"A","B"};となっています。これは「文字列型の配列」です。
文字列は内部では配列になっています。C言語のchar型配列をクラスに包んでプログラマが意識せずに使えるように提供しているだけだと思います。
なので二次元配列と見なしてもいいかもしれません。厳密には違いますが。

知りたい事 1.while(j < array[i].length())の意味

array[i].length()はまずarray[i]の値を取り出します。i = 0 のときはarray[0] = "A"なので、"A"の長さを調べます。長さは1になりました。
よってarray[0].length()は1となります。このようにして考えます。

知りたいこと 2.length()無視してarrary[i]だけをみていいのか(その場合の理由も知りたいです)

単にarray[i]のオブジェクトを取り出して、そのオブジェクトのlengthメソッドを動かしているだけです。

投稿2022/11/21 00:28

編集2022/11/21 00:41
BeatStar

総合スコア4958

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

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

dodox86

2022/11/21 01:12

> C言語のchar型配列をクラスに包んでプログラマが意識せずに使えるように提供しているだけだと思います。 なので二次元配列と見なしてもいいかもしれません。厳密には違いますが。 誤解を受け易い、あるいは初心の方が混乱しそうな表現は控えた方が良いのではないでしょうか。「思う」とは言うなれば単なる所感です。C言語のお話ではないし、2次元配列で書くことが可能なコードは、本ケースでは使えません。 実装依存ではあるでしょうが、OpenJDK ではchar型の配列と言うのは当たってはいますけれども。実際、多くの処理系ではこのようなかたちになるでしょうね。 http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/lang/String.java
guest

0

1.while(j < array[i].length())の意味

arrayはString型配列の変数、array[i]はi番目の要素、array[i].length()はi番目の要素のString:文字列の長さになります。
length()だけではどの文字列の長さなのか対象がわからず、意味をなさないので単体では使えません。
array[0]とすればarrayの0番目の要素である文字列「A」を指しますが、array[0].length()とするとその文字列の長さになります。
文字列とその文字列の長さという2つの意味を持つわけではありません。
そのためarray[i].length()は0番目、1番目共に1を返します。

do{}while()は一度{}の処理が実行されてから判定を行うので
jをインクリメントして0から1にして判定を行います。
判定結果はfalseなのでこれで処理終了です

2.length()無視してarrary[i]だけをみていいのか

無視していい理由はありません

投稿2022/11/20 15:50

編集2022/11/20 22:22
Crimson_Tide

総合スコア509

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問