かなり初歩的な質問です。
あるBeanで
public static String lst_data[][] = new String[5][14];
という配列を宣言してます。
処理のなかで、
lst_data = str_data;
clrPara();
としています。str_data配列をlst_dataに
セットしているんですが、
clrPara()のなかで、str_dataをクリアにする
処理を行っています。
そうすると、lst_dataに一旦セットされたものが
str_dataのクリアで、lst_dataもクリアされて
しまっているようです。
lst_dataの値は保持するにはどのようにしたらいいので
しょうか??
No.1
- 回答日時:
lst_data がクリアされているのは、str_data をクリアしたためではなく、
lst_data に str_data を代入することによって、元の lst_data を参照
するものがなくなったためではないかと思います。
どこかに保存してから代入するようにしたらどうでしょう。
saved_data = lst_data;
lst_data = str_data;
clrPara();
プログラムの他の部分が分からず、これが原因かどうか確信がないため、
「自信なし」です。
この回答への補足
lst_dataのアドレスを参照していたから
ですよね。クリアされちゃったのは。。
でも、
saved_data = lst_data;
としても、結果、アドレス参照するので
同じなのではないでしょうか??
No.2
- 回答日時:
Javaでは,プリミティブ(boolean, char, byte, short, int, long, float, double)以外の変数はオブジェクトとして扱われ,オブジェクトの代入は全て参照(アドレス)の代入によって行われます。
String もオブジェクトですし,配列もオブジェクトです。lst_data = str_data;
では,str_dataのString配列が実際に格納されているメモリ上のアドレスがlst_dataにコピーされます。str_dataの中身がコピーされるわけではありません。
図にすると
str_data --→ メモリ(xxxx番地):{{"ab","cd",..,"ef"},{"bc","de",..,"fg"},..,{"cd","ef",..,"gh"}}
|
|<lst_data = str_data;>
↓
str_data -+→ メモリ(xxxx番地):{{"ab","cd",..,"ef"},{"bc","de",..,"fg"},..,{"cd","ef",..,"gh"}}
|
lst_data -+
となり,
str_data --→ メモリ(xxxx番地):{{"ab","cd",..,"ef"},{"bc","de",..,"fg"},..,{"cd","ef",..,"gh"}}
|
|<lst_data = str_data;>
↓
str_data --→ メモリ(xxxx番地):{{"ab","cd",..,"ef"},{"bc","de",..,"fg"},..,{"cd","ef",..,"gh"}}
lst_data --→ メモリ(yyyy番地):{{"ab","cd",..,"ef"},{"bc","de",..,"fg"},..,{"cd","ef",..,"gh"}}
のようには*なりません*。
このため,str_dataの中身を変更すると当然lst_dataの中身も変更されることになります。
後者のような効果を得たいのであれば,Javaでは普通 clone() 関数を使います。こんな感じです。
lst_data = str_data.clone();
ただし,clone() 関数を利用するには,オブジェクトが所属するクラスが Clonable インターフェイスをサポートしていることが必要で,またこの関数が実際にどのような振る舞いをするかは,個々のクラスでの実装に依存します。StringはClonableだったと思いますが,Stringの二次元配列がどうなのかは分かりませんので,調べてみてください。
この回答への補足
>str_dataの中身がコピーされるわけではありません。
そうですね。アドレスを参照して、中身をみてる
感じなんですよね?
>clone() 関数を利用するには,オブジェクトが
>所属するクラスが Clonable インターフェイスを
>サポートしていることが必要
Stringの2次元配列は、よくわかりませんでした。。
No.3
- 回答日時:
#2の回答を書いたatonです。
補足に対するアドバイスです。>>clone() 関数を利用するには,オブジェクトが
>>所属するクラスが Clonable インターフェイスを
>>サポートしていることが必要
>Stringの2次元配列は、よくわかりませんでした。。
実際に
lst_data = str_data;
の部分を
lst_data = str_data.clone();
のように変えて実行してみることを薦めます。
それでうまくいけばそれでよし,ダメならばまた補足に書いてもらえればと思います。
No.4
- 回答日時:
#1の回答を書いたranxです。
>> lst_dataのアドレスを参照していたから
>> ですよね。クリアされちゃったのは。。
は、その通りかもしれません。が、前の回答で私が言おうとしたのは、
lst_data = str_data;
とした時点で(つまりclrPara()を呼ぶ以前に)
public static String lst_data[][] = new String[5][14];
と定義したものはちゃらになってしまっていますよ、ということだったのです。
このnew String[5][14]は全く無視してしまっていいということでしたら、
atonさんのおっしゃることが当たっているかもしれません。
(私としては、相変わらずsuigakuさんの意図がさっぱり分からないのですが)
ただ、もしそうならば、clrPara()の中では、str_dataをクリアするのではなく、
str_data = null; とか
str_data = new String[5][14]; とかやってしまった方が簡単な気がするのです
けれど、それではまずいんでしょうかね。
この回答への補足
>lst_data = str_data;
>とした時点で(つまりclrPara()を呼ぶ以前に)
>public static String lst_data[][] = new String[5][14];
> と定義したものはちゃらになってしまっていますよ、
チャラになっちゃうってことですか。。
えーと。。でもstr_dataも
[5][14]の配列なんですが。。。
もう一度定義され直されるって意味でしょうか。。
すみません。
str_data = null;
とはしたくないんです。
それは、str_dataのなかにコンボのセット値も
入ってるので、nullってわけではないんですね。
初期値があるものもあるので、。。。
セットしなおしてるんです。clrParaで。
No.5ベストアンサー
- 回答日時:
atonです。
ranxさんの#4の回答を見て自分の見落としに気がつきました。
最初の宣言は,
public static String str_data[][] = new String[5][14];
だと思い込んでいたんですが,
public static String lst_data[][] = new String[5][14];
だったんですね。これだと,ranxさんの言われるように上記宣言は
lst_data = str_data;
とした段階でちゃらになります。
が,だからといって私が#2で書いたことは意味がないわけではありません。おそらくsuigakuさんの意図は,
lst_data = str_data;
で一回前のデータ(lst_data → "last data" という連想)を保存し,
clrPara();
以降で str_data に新たな値を入れて処理を続けたいではないかと思っているのですが,そうだとするならば,最初の変数宣言がどうであろうと,(clone() が機能すれば)
lst_data = str_data.clone();
clrPara();
で目的は達成できるはずです。
#以下余談:
単にそれだけであれば,最初の宣言は
public static String lst_data[][];
でいいし,clrPara() は(内部で何をやってるのか知りませんが,もし中身をクリアするだけでよいのであれば)ranxさんの言われる通り,
str_data = null;
str_data = new String[5][14];
で充分でしょう。もっとも,この処理がループの中だったりするなら,何度もnewで領域確保が行われるのは気持ち悪いのはたしかですが(でも,たぶん一個一個クリアするよりは高速でしょう)。
この回答への補足
str_dataもlst_dataも[5][14]です。
>一回前のデータ(lst_data → "last data" という連想)を保存し,
>clrPara();
>以降で str_data に新たな値を入れて処理を続けたい
>ではないかと思っているのですが
ハイ。そのとおりです。
cloneは使えなかったです。
型の互換性がないとエラーがでました。
また、clrPara()は、配列要素によっては、
クリアじゃなく、初期値をセットしているので
nullや、newでセットできないのです。
何度もすみません。。
No.6
- 回答日時:
ご質問に対する直接の回答にはならないと思いますが、
こんな風にした方がすっきりすると思いますよ。
public class MainClass
{
ParameterSet lst_data; // public static にする必要性はあるのかな?
ParameterSet str_data;
public void main(String args[]) // とりあえず
{
lst_data = new ParameterSet();
・・・・
lst_data = str_data;
str_data = new ParameterSet();
・・・・
}
}
public class ParameterSet
{
// データの実体
private String data[][];
// コンストラクタ
public ParameterSet()
{
data = new String[5][14];
// 初期化処理
}
}
この回答への補足
ありがとうございます。
ranxさんのようにかくと、
Javaぽいですね。
Javaぽいというか、オブジェクト指向言語
ということがわかります。
私はどうも今までやってたような
やり方(VBとか)でやりがちです。
だから、いまいち、オブジェクト指向
を生かしたコーディングが出来てない気がします。
もっとオブジェクト指向という概念を
生かしたPGをつくりたいのですが
まだまだ勉強がたりてないのだとおもいます。
なにかいい参考書やページがありましたら
教えていただきたいです。
また、よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Java配列の問題を教えてくださ...
-
Javaでのカンマで配列を分ける方法
-
JAVAで配列の要素に、負の値が...
-
VC#での、複数コンボボックスへ...
-
Javaで文字と数字が混ざったも...
-
ArrayList で配列を扱う場合の...
-
C#で動的配列Listの中身をListB...
-
main(String[] args) の args...
-
配列について
-
C#の質問
-
cloneメソッドについて (java)
-
java キーボード入力された値の...
-
1~100までの数字を表示し、か...
-
BOOL値を逆にしたい
-
エクセルVBAで「〜」が表現でき...
-
Java配列でNullPointerExceptio...
-
パソコンキーボードで時分秒を...
-
IF関数でEmpty値を設定する方法。
-
コマンドライン引数の例外処理...
-
C++、クラスメンバの構造体配列...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
配列で、値の入っている要素数...
-
【C#】ハッシュテーブル(連想...
-
[Ljava.lang.Stringってなんですか
-
javamailで複数人にメールを送...
-
この警告はどうすれば?
-
main(String[] args) の args...
-
javaで大容量テキストファイル...
-
Javaで文字と数字が混ざったも...
-
ページング
-
C言語でunsigned char配列を連...
-
Javaで文字を漢字であるか否か...
-
配列の中に複数存在する数がい...
-
C#で動的配列Listの中身をListB...
-
『args[]』とは?
-
同じ配列またはクラスを、2回...
-
java StringとString[]の違い
-
配列をセッションに割り当てた後で
-
【Ajax通信&Java】配列の受け取...
-
セッションを使ったint型の値の...
-
forループの評価(条件)式につ...
おすすめ情報