![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
かなり初歩的な質問です。
ある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.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をつくりたいのですが
まだまだ勉強がたりてないのだとおもいます。
なにかいい参考書やページがありましたら
教えていただきたいです。
また、よろしくお願いします。
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.3
- 回答日時:
#2の回答を書いたatonです。
補足に対するアドバイスです。>>clone() 関数を利用するには,オブジェクトが
>>所属するクラスが Clonable インターフェイスを
>>サポートしていることが必要
>Stringの2次元配列は、よくわかりませんでした。。
実際に
lst_data = str_data;
の部分を
lst_data = str_data.clone();
のように変えて実行してみることを薦めます。
それでうまくいけばそれでよし,ダメならばまた補足に書いてもらえればと思います。
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.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;
としても、結果、アドレス参照するので
同じなのではないでしょうか??
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- その他(プログラミング・Web制作) Python - Excel で Webからデータを連続取得したいのですが エラーが出ます 1 2023/07/06 20:08
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- Excel(エクセル) 格納したデータを配列のように扱う方法はありますか? 8 2023/06/05 08:53
- その他(プログラミング・Web制作) pythonでDBのカラム名で取得したオブジェクトの値を表示したい 1 2022/05/13 03:41
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- JavaScript 【jquery】EasyUIのSubGridにMySQLのテーブルデータを表示&編集にしたい 5 2022/05/02 13:10
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- JavaScript EasyUIのSubGrid(jquery)におけるObjectに入れた連想配列について 1 2022/05/02 11:21
- その他(Microsoft Office) Excel 2列分のDATAの並べ替え 1 2023/01/01 17:12
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
java
-
C言語でunsigned char配列を連...
-
[Ljava.lang.Stringってなんですか
-
エラーのStackTraceをString変...
-
java 乱数を並べて重複させない...
-
Javaの配列の中身の並び替え
-
JAVAで配列の要素に、負の値が...
-
Java 配列に1から25以外の値が...
-
配列の中に複数存在する数がい...
-
MAPの配列・・・???!!!
-
このPGの良い使い方を教えて下...
-
サーブレットで複数値の受取り
-
Vectorクラスの使い方
-
「シンボルを見つけれません」...
-
ArrayListからBean配列に値をセ...
-
javaで素数を探すプログラム。
-
プログラミングの問題です。大...
-
Visual Basic でのコードをASCI...
-
マージソートについて
-
【struts】 ActionFormで別のAc...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
n番目に大きな値を探索する
-
この警告はどうすれば?
-
[Ljava.lang.Stringってなんですか
-
Javaで文字を漢字であるか否か...
-
配列をセッションに割り当てた後で
-
配列の中に複数存在する数がい...
-
java
-
Javaで文字と数字が混ざったも...
-
C#で動的配列Listの中身をListB...
-
配列で、値の入っている要素数...
-
『args[]』とは?
-
【C#】ハッシュテーブル(連想...
-
ページング
-
セッションを使ったint型の値の...
-
配列について
-
同じ配列またはクラスを、2回...
-
ArrayListからBean配列に値をセ...
-
Java配列の問題を教えてくださ...
-
java 大文字と小文字を入れ替える
-
同じ文字を探しカウントしたい
おすすめ情報