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

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

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

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1675閲覧

JSのfor文について分からない事があります。

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2019/12/07 00:49

編集2019/12/07 16:59

1行目で正の整数nが入力され、続くn行の各行で整数が1つずつ入力されます。n個の整数を小さい順に改行区切りで出力してください。

実行環境はwebサイト(学習サイト)上にあります。
入力データは、
入力例1の場合
5
3
5
19
1
2
入力データ2の場合
10
2
3
4
5
4
3
2
1
1
8
になっています。
この入力データは変数linesに配列として格納されており、
インデックス[0]番目は、以降インデックスの数(n個)を表しております。
例ですが、入力データ1の場合は、lines[0]に5が格納されており、lines[1]〜[5]まで出力しないといけないという事です。(出力の際は改行区切りで出力しないといけないルールです)
上記入力データ1,2を書きましたが、これはあくまで入力例であり、実際には入力されたデータは隠されており見る事ができません。

今回の質問ですが
問題は解けたのですが、for文を2回書いている所が気になります。
なぜか1回目のfor文の末尾にconsole.log(arr[i]);を書くと
3
5
19
19
19
と出力されてしまいます。(入力例1の場合)
なぜ、このような出力結果になってしまうのでしょうか?
ご回答よろしくお願いします。

process.stdin.resume(); process.stdin.setEncoding('utf8'); var lines = []; var reader = require('readline').createInterface({ input: process.stdin, output: process.stdout }); reader.on('line', (line) => { lines.push(line); }); reader.on('close', () => { var n = lines[0]; var arr = []; function compare(a,b){ return a-b; } for(var i=0; i<n; i++) { arr.push(lines[i+1]); // arr.sort(compare); 編集前 // console.log(arr[i]); }     arr.sort(compare); // 編集後 for(var i=0; i<n; i++){ console.log(arr[i]); } });

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

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

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

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

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

y_waiwai

2019/12/07 01:21

なぜ、といわれても、あなたがそう入力したからとしか言えないですが、いったいなにをききたいんでしょうか
2KOH

2019/12/07 01:35

実行環境を提示してください(JavaScript ですが、ブラウザでは実行できませんよね)。 入力データを提示してください。 期待する出力結果を提示してください。 まあ、何を勘違いしているのかは上記が提示されていなくてもなんとなくわかるのですが、こんな情報不足の質問には回答したくありません。
退会済みユーザー

退会済みユーザー

2019/12/07 16:53 編集

y_waiwaiさん 2KOHさん 言葉足らずで失礼しました。 修正させて頂きました。
guest

回答1

0

ベストアンサー

なぜ、このような出力結果になってしまうのでしょうか?

i番目まで入れてソートした後に、最後の要素を出力していく、という動作となります。

(逆に、どうなると思ったのでしょうか。)

投稿2019/12/07 01:24

編集2019/12/07 01:25
maisumakun

総合スコア145183

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

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

maisumakun

2019/12/07 01:26

本題ではありませんが、出力が最後の1回だけでいいなら、1つ追加するたびにソートする必要性はありません。追加だけ全部済ませてからソートは最後に行う、というほうが合理的です。
退会済みユーザー

退会済みユーザー

2019/12/07 02:42 編集

ご回答いただきありがとうございます。 arr=['3','5','19','1','2']からソートしたら、arr=[ '1', '2', '3', '5', '19' ] になっているのですが、 「i番目まで入れてソートした後に、最後の要素を出力していく、という動作となります。」 の意味が申し訳ありませんが理解できません。 出力は確かに最後の1回でいいので、ソートはfor文の外に出しておきます。 ご指摘ありがとうございます。
maisumakun

2019/12/07 02:45

> arr=['3','5','19','1','2']からソートしたら いえ、最初のarrは[]です。
退会済みユーザー

退会済みユーザー

2019/12/07 02:55

失礼しました。 最初にarrは[]を代入しておき、 for内で arr.push(lines[i+1]);をして arrに3,5,19,1,2格納した後に、 それをソートしたらarr=[ '1', '2', '3', '5', '19' ]になっています。 その後、console.log(arr[i]);をすると3,5,19,19,19になるのかが分かりません。
maisumakun

2019/12/07 02:59

> その後、console.log(arr[i]);をすると3,5,19,19,19になるのかが分かりません。 それは元のコードの話ですよね?入れながらソートしているので、入っている文でしか結果が出てこなかっただけです。
maisumakun

2019/12/07 03:00

途中でソートしない今のコードでは、入れた順に表示されるだけかと思います。
退会済みユーザー

退会済みユーザー

2019/12/07 03:07

確かに、編集後のコードではもう3,5,19,19,19にはなりません。 しかし、なぜ3,5,19,19,19になるのかを初心者にもわかる様に教えていただきたかっただけです。 コメント何度もしてしまい失礼しました。
maisumakun

2019/12/07 03:20 編集

ループ内に入れたconsole.logの直前か直後で、配列全体を出力すればすぐわかるかと思います。
maisumakun

2019/12/07 03:21

> それをソートしたらarr=[ '1', '2', '3', '5', '19' ]になっています。 その後、console.log(arr[i]);をすると3,5,19,19,19になるのかが分かりません。 元のコードでは、ソート「しながら」出力していることがポイントです。
退会済みユーザー

退会済みユーザー

2019/12/07 16:53 編集

再度ご回答いただきありがとうございます。 ソート「しながら」を意識して、今一度コードを見直します。
maisumakun

2019/12/07 05:16

> 3→5→19までは比較できるが、「19」以降の「1」、「2」は比較できないため 「19」が続いてループされているということでしょうか? 違います。出力がconsole.log(console.log(arr[i]))ですが、この時点で配列の要素はi+1個しかないので、常に配列の「最後」が出力されています。
maisumakun

2019/12/07 05:18

コードが何をしようとしているか、ふわっと推測するのではなく、「この行では配列の中身が何になっているか細かく確認する」、あるいは「この行で何が実行されるから結果がどうなる」という理屈を持って追いかけていく、ということをしてください。
退会済みユーザー

退会済みユーザー

2019/12/07 05:24

すいません、ご指摘通りもっと細かく調べてみます。 ご回答ありがとうございます。
退会済みユーザー

退会済みユーザー

2019/12/07 06:18 編集

[ '3', '5' ] arr[ i(0) + 1] (インデックスが[1]の'5'が出力) [ '3', '5', '5' ] arr[ i(1) + 1 ] (インデックスが[2]の'5'が出力) [ '3', '5', '5', '19' ] arr[ i(2) + 1 ] (インデックスが[3]の'19'が出力) [ '1', '3', '5', '5', '19' ] arr[ i(3) + 1 ] (インデックスが[4]の'19'が出力) [ '1', '2', '3', '5', '5', '19' ] arr[ i(4) + 1 ] (インデックスが[5]の'19'が出力) やっと理解する事ができました。 長々とありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問