ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Javaの課題丸投げコミュの配列の代入やコピーに関するプログラム

  • mixiチェック
  • このエントリーをはてなブックマークに追加
いつもお世話になっています。以下の問題なのですが、どなたかご教示ください。

変数の置き換えに関する問題だと思ったのですが、実際どこがおかしいかといわれてみると全くわかりません。
よろしくお願いします。

−−−−−−−−

問題5. 与えられた整数配列に対して、負の値だけ0に変えた配列と正の値だけ0に変えた配列を作りたいので、次のようなメソッド negativeToZero と positiveToZero を作ったが、これはまずい!と言われた。理由を述べよ(図示したりして丁寧に説明せよ)。
さらに、その理由にそって、メソッド negativeToZero の部分を書きなおしなさい。
答案に書くのはメソッド negativeToZero のみで良い。また、positiveToZero については書かなくて良い。

public class Problem3 {
public static void main(String[] args) {
int[] a = {1, -2, 3, -4, 5};

int[] b = negativeToZero( a );
int[] c = positiveToZero( a );
// 以降は省略
}

// 与えられた配列から負の数を0に変えた配列を求めて返す
int[] negativeToZero(int[] a) {
int[] b = a;
for(int i=0; i<b.length; i++) {
if(b[i] < 0) b[i] = 0;
}
return b;
}

// 与えられた配列から正の数を0に変えた配列を求めて返す
int[] positiveToZero(int[] a) {
int[] b = a;
for(int i=0; i<b.length; i++) {
if(b[i] > 0) b[i] = 0;
}
return b;
}

}

コメント(6)

これらのメソッドは、与えられた配列のコピー(clone)を行わず、与えられたインスタンスを直接操作して返します。
与えられた配列を直接操作するため、mainメソッド内の3つの変数『a,b,c』は同じArrayのインスタンスが代入されることになります。
また、二つのメソッドにより、負の数を0にしたあと、正の数を0にしているため、配列の要素はすべて0になります。
よって、当初の目的である『負の値だけ0に変えた配列と正の値だけ0に変えた配列を作りたい』という要求が満たされません。


とりあえず以下のように修正することで、目的は達成できるようになります。

========= 変更前 =========
int[] b = a;

========= 変更後 =========
int[] b = (int[])a.clone();
>seraphさん
いつもいつもありがとうございます_(_^_)_
数値代入ではなく、コピーして返すようにしなければいけなかったのですか。
もしcloneableクラスを知らなかったらそれと同様なクラスを組む必要があったと。。。orz


ところで実際に稼働させると
>型 problem05 の非 static メソッド negativeToZero(int[]) を static 参照することはできません
なる表示が出るのですが、実際にnegativeToZero(int[])をststicしても正常に動作しません。

こちらの理由は何なのでしょうか。
よろしければお願いします。
おっと、実際に動かしたわけじゃないので、非staticであることを見逃してました。

> 実際にnegativeToZero(int[])をststicしても正常に動作しません。

正常に動作しない、とはどういう意味ですか?
javacが通らないということですか?
javaコマンドで実行したときに例外が発生したりするということですか?
それとも、実行した結果、得られる配列が求めているものではないと言うことですか?

こちらの環境では、二つのメソッドをstaticメソッドにすることで正常に動作しています。
どういう理由で、『正常に動作しない』と判断したのかを教えてください。
また、実際にコンパイル/実行したソースコードも教えてください。

public class Problem03 {
public static void main(String[] args) {
int[] a = {1, -2, 3, -4, 5};

int[] b = negativeToZero( a );
int[] c = positiveToZero( a );
// 以降は省略
}

// 与えられた配列から負の数を0に変えた配列を求めて返す
static int[] negativeToZero(int[] a) {
int[] b = (int[])a.clone();
for(int i=0; i<b.length; i++) {
if(b[i] < 0) b[i] = 0;
}
return b;
}

// 与えられた配列から正の数を0に変えた配列を求めて返す
static int[] positiveToZero(int[] a) {
int[] b = (int[])a.clone();
for(int i=0; i<b.length; i++) {
if(b[i] > 0) b[i] = 0;
}
return b;
}

}

以上をProblem03.javaでwinXP、eclipse3.4.2プラットフォームで書きました。

この状況で、ローカル変数bは読み取れません、ローカル変数cは読み取れません。
とソースコードの横にマークが出ています。


また、eclipseで[Java アプリケーション]で実行させるとコンソールには空欄が表示(エラーも出力結果も表示されない)されます。
> この状況で、ローカル変数bは読み取れません、ローカル変数cは読み取れません。

それは、『読み取れません』ではなく『読み取られません』です。
変数が定義されているのに使用されていない場合に発生する警告です。


> また、eclipseで[Java アプリケーション]で実行させるとコンソールには空欄が表示(エラーも出力結果も表示されない)されます。

当然です。
上記のコードには、標準出力に文字列を書き込むコードがありません。
結果を確かめるには、配列の中身を出力するか、デバッガで停止させて値を見るかしなければなりません。
>seraphさん
いつもありがとうございます_(_^_)_
助かりました_(_^_)_

>当然です。
>上記のコードには、標準出力に文字列を書き込むコードがありません。

・・・・・・そうでした・・・orz
でないはずですよね、忘れていました。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Javaの課題丸投げ 更新情報

Javaの課題丸投げのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング