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

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

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

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

4回答

1911閲覧

Javaのfor文と拡張for文の使い分けについて

stakak61

総合スコア71

Java

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2020/05/10 15:15

編集2020/05/12 01:42

前提・実現したいこと

拡張for文を使用して、配列の値を変更したいと考えています。
for文では、配列の値を変えることができるのですが、
拡張for文では自分の思う様に配列の値を変更をうまくできずに困っています。

######以下の様な通常のfor文の様な出力結果を拡張for文を利用して求めたいと思っています。

実現することが出来たfor文の例

java

1public class Array{ 2 public static void main(String[] args){ 3 int[] array = {100,200,300}; 4 array_change(array); 5 6 for(int i : array){ 7 System.out.println(i); 8 } 9 } 10 11 public static void array_change(int[] array){ 12 for(int i=0; i < array.length; i++){ 13 array[i] ++; 14 } 15 } 16}

出力結果

101 201 301

拡張for文を利用して試したこと

java

1public class Array{ 2 public static void main(String[] args){ 3 int[] array = {100,200,300}; 4 array_change(array); 5 6 for(int i : array){ 7 System.out.println(i); 8 } 9 } 10 11 public static void array_change(int[] array){ 12 for(int i : array){ 13 i ++; 14 } 15 } 16}

###問題の出力結果

100 200 300

###利用環境
Eclipseを利用して、学習を進めています。

何かしらのヒントを何卒よろしくお願いいたします。

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

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

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

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

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

guest

回答4

0

ベストアンサー

1つ目のコードは配列の各要素をインクリメントしていますが、2つ目のコードは変数iをインクリメントしているだけです。
なので2つ目のコードは配列の中身が変更されず出力されます。

eclipseを使っているならデバッグ機能があるはずなので、1行ずつ実行しながらどの変数がどのように変化するか確認してみてはいかがでしょうか。

投稿2020/05/10 15:31

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

stakak61

2020/05/10 15:37

回答ありがとうございます。
stakak61

2020/05/10 15:44

少し深く質問なのですが 例えば、 main関数内、array_changeメソッドはコメントアウトして、拡張for文前で int[] i = array; i[1] += 1; を加えて、実行すると、値は変更されると思うのですが、ここの違いはどうしてでしょうか
nimosoh

2020/05/10 16:30 編集

横から失礼します。 int[] i = array; という書き方をすると 「array」という配列と「i」という配列は同じメモリを参照することになります。 つまり、i[1] += 1 が実行されることは array[1] += 1 が実行されることと同じなのです。 ゆえに、下の拡張for文ではarray[1]が1足された結果(201)が出力されるわけです。
退会済みユーザー

退会済みユーザー

2020/05/10 17:34

nimosohさんフォローありがとうございます。 stakak61さん 私の回答の >2つ目のコードは変数iをインクリメントしているだけです。 のところが少し説明不足で混乱させてしまったかもしれません。 メソッドarray_changeの拡張for文で用いた変数iはint型であり、ループ毎に配列arrayの各要素の「値のコピー」を最初の要素から順番に受け取ります。 int型の変数iの中には要素の「値のコピー」が入っているだけであって、配列の要素が直接入っているわけではありません。 そのためiの値をどのように変更しても配列arrayの要素は何も変更されません。 ですが、nimosohさんの説明の通り int[] i = array; i[1] += 1; というような書き方をすると要素の中身の値が直接変更されるため出力結果も変わってきます。 以下の記事を読めば配列と拡張for文についてより理解が深まるかと。 https://www.javadrive.jp/start/array/index3.html https://forthewin.co.jp/it_blog/java_content
stakak61

2020/05/11 00:13

ありがとうございました。今後その様な違いを気をつけながら、学習していきます。
guest

0

int ではダメですが、int[] だと、拡張for文でも値を変更できます。

Java

1class Main { 2 public static void main(String[] args) { 3 int[][] array = { {100}, {200}, {300} }; 4 array_change(array); 5 6 for(int[] e : array) 7 System.out.println(e[0]); 8 } 9 10 public static void array_change(int[][] array) { 11 for (int[] e : array) 12 e[0]++; 13 } 14}

実行結果

101 201 301

.
なお、質問では実行結果を提示していますが、
質問のコードはコンパイルできませんね。

追記
質問のコードが修正されたようですが、まだコンパイルできません。

Array.java:1: エラー: '{'がありません public class Array(){ ^ Array.java:2: エラー: ')'がありません public static void main(String[] args]{ ^ エラー2個

投稿2020/05/10 16:55

編集2020/05/11 00:43
kazuma-s

総合スコア8224

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

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

stakak61

2020/05/12 01:44

回答ありがとうございました。ご指摘の通り、文法上のエラーが見られたため、再度修正いたしました。 ありがとうございます。
guest

0

拡張forを使って元の配列やコレクションの内容を変更することはできません。

投稿2020/05/10 15:31

swordone

総合スコア20669

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

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

0

for(int i : array){

では、arrayの内容が順番にiに代入されます
なので、いくらiをいじったところで、arrayには影響与えません

投稿2020/05/10 15:31

y_waiwai

総合スコア88042

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問