• ベストアンサー

java 配列について

public class Sample{ public static void main( String[ ] args ){ String x = "pen"; String[] y = new String[1]; y[0] = x; x = "pencil"; System.out.println(y[0]); } } java初心者です。 配列の参照先を変更して 配列の数を変更せず配列0に 実行時にpencilと表示させたいのですが よい方法はありますでしょうか?

  • koron
  • お礼率61% (55/89)
  • Java
  • 回答数4
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • takaP-
  • ベストアンサー率79% (83/105)
回答No.4

Javaの配列は「参照」を保持します。 JavaのStringは「定数」です。 x="pencil"; として、xの値である文字列を変更したつもりでも、 実際にはxの参照先を変更しているに過ぎません。 確かに上記の説明を「変数xに文字列"pencil"を代入」 などという説明をしている書籍も目にしますが、 「文字列"pencil"の参照を代入」が正しいと思います。 はじめは理解しづらいかもしれませんがその内馴れます。 で、配列はxの参照先が"pencil"の参照へ変更されたと しても、保持している参照先は"pen"の参照のままですの で、System.out.println(y[0]); としたところで出力 されるのは"pen"ということになります。 #3の方が提示したのは、配列が保持している"pen"の 参照を"pencil"の参照に置きかえる方法です。 で、私は配列に保持されている参照を変更せずに参照先 の値を変更する方法です。 定数であるStringではその様な事は不可能ですので、 StringBufferを使ってみてはと提案しました。 StringBufferクラスの存在意義は「参照を変更せずに 文字列内容を変更・操作できる」ところにあります。 >インデックスを指定しないとどうもコンパイルエラー >になるようでした。 失礼しました。 >Stringにもreplace()がありました。 >どのように使い分けたらいいのかな? メソッド名は同じですが、StringとStringBufferには 継承関係もありませんし別物です。 新たに文字列オブジェクトを「作る」のか、元の文字列 を「変更」するのかによって使い分けてください。

koron
質問者

お礼

いろいろお世話になりました。 大変勉強になりました。

その他の回答 (3)

  • gahahei
  • ベストアンサー率13% (3/22)
回答No.3

y[0]=x; //y[0]には"pen"が格納 x= "pencil"; //xには"pencil" System.out.println(y[0]); //xは"pencil"だが、y[0]は"pen"のまま >配列の参照先を変更して でも、配列1こしかないよ?(new String[1]) >配列の数を変更せず配列0に ただ単にy[0]に今度は"pencil"を代入したいだけなら String x = "pen"; //xには初め"pen"が入っている String[] y = new String[1];  //配列は1つ y[0] = x; //y[0]には"pen"を代入 System.out.println(y[0]); //"pen"を表示(現在のy[0]は"pen") x = "pencil"; //xに"pencil"を代入 y[0] = x; //y[0]に"pencil"(x)を代入 System.out.println(y[0]); //"pncil"を表示 と、いう事? 勘違いしてたらごめんなさい。

koron
質問者

お礼

ありがとうございました。 上記の方法で確かに確認とれました。 説明付きで助かりました。 配列と代入を逆に考えればよいですね?

  • takaP-
  • ベストアンサー率79% (83/105)
回答No.2

StringではなくてStringBufferを使ってはどうでしょう。 StringBuffer x=new StringBuffer("pen"); StringBuffer[] y=new StringBuffer[1]; y[0]=x; x.replace("pencil"); System.out.println(y[0]);

koron
質問者

お礼

StringBuffer を使用する考え方もあるようですね。 大変参考になりました。ありがとうございました。 早速上記でためしてみたら、インデックスを指定しないとどうも コンパイルエラーになるようでした。 x.replace(0,3,"pencil"); Stringにもreplace()がありました。 どのように使い分けたらいいのかな?

  • --neiro--
  • ベストアンサー率15% (22/139)
回答No.1

javaは専門では有りません事を先に伝えさせて頂いた上でアドバイスさせて頂きます。 件の様な場合、ポインタを使ってみてはいかがでしょうか? y[0] = x; のところを y[0] = &x; とすれば良いのではないかと思われます。 参考URLを参照してみてください。

参考URL:
http://www.mars.dti.ne.jp/~torao/program/c/pointer.html
koron
質問者

お礼

アドバイスありがとうございました。 早速試してみました。 どうもy[0] = &x; がうまくいかないようです。 ホームページをみてみたのですが、どうもjavaではなくC++のHP でした。 多分javaと扱い方が違うのかな?

関連するQ&A

  • Javaについて教えてください!

    sampleパッケージに属するMain.javaとSub.javaがあり、Main.javaのmainはSub.javaのsubメソッドを呼び出して「OK」と表示させるプログラムを教えてください! //Main.java package sample; public class Main{ public static void main(String[] args){ Sub.sub(); }} //Sub.java package sample; public class Sub{ static String str = "OK"; public static void sub(){ System.out.println(str); }} String型の変数strはクラス変数で行いたいのですが、どこを改善すれば良いでしょうか?

    • ベストアンサー
    • Java
  • Javaプログラミングの配列について

    ・前と同じような質問になってしまうのですが… 下のプログラミングで配列の最大値を求める場合のアルゴリズムは少し わかるのですが… それをJavaプログラミングで表記することができません! 下の場合の配列の最大値を求めるJavaプログラミングの表記方法を教えてください。 public class PrintMaxData{ public static void main(String[] args){ int[] numberDate={15,46,88,56,17,93,22,75,58,77}; //配列中の最大値を求める //出力 System.out.println("最大値は"+maxData+"です。"); } }

  • Javaについて教えてください。

    Javaのソースコードで以下のコードを実行すると表示されないのですがなぜでしょうか? public class Sample{ public static void main(String[] args){ for (int i = 0 ; i >= 5; i++){ System.out.println(i); } } }

  • javaが実行されない

    雑誌を買ってjavaでプログラミングをしているのですが なぜか実行できません。 ツールはteraPadとJDKを使っています。 public class sample { public static void main(String[] args) { System.out.println("hello!"); } } コンパイルし、classファイルを実行すると Exception in thread "main" java.lang.NoClassDefFoundError: sample/class と出て実行できません。結果はhello!となるはずなのですがどなたかどこがおかしいのか教えてください。

    • ベストアンサー
    • Java
  • Javaで配列を定義する方法

    こんにちは、片岡といいます。 Java言語で配列を定義する場合、以下の二つの書式に違いはありますか。 違いがあるとすれば、どのような違いですか。 また、違いがないのならば、どちらの記述がよいのですか。 ご存知の方はいらっしゃいませんか。 (1) public class Main1 { public static void main(String[] args) { String str[] = new String[] { new String("itiban"), new String("niban"), new String("sanban"), }; for (int i = 0; i < str.length; i++ ) { System.out.println(str[i]); } } } (2) public class Main2 { public static void main(String[] args) { String str[] = { new String("itiban"), new String("niban"), new String("sanban"), }; for (int i = 0; i < str.length; i++ ) { System.out.println(str[i]); } } } なお、私の環境は以下の通りです。 OS: Microsoft Windows XP Professional SP2 java: java version "1.4.2_13" 検索エンジンで"配列 オブジェクト java"を検索しましたが、 解決に役立つ情報は見つかりませんでした。

    • ベストアンサー
    • Java
  • 参照型の2次元配列の作り方

    参照型の2次元配列の作り方 実行結果は、 赤レッド 黄イエロー 青ブルー と画面表示されるようにしたいのです。 class Sample{ public static void main(String[]args){ String[][] str ={{      ?     }}; System.out.println(     ?     ); } } ?のところをどう書いたらよいか御指導御願い致します。

    • ベストアンサー
    • Java
  • javaの問題わからなくって質問します

    内容はEclipse上でプロジェクトフォルダを作りひとつは別のjavaファイルを動かすのともう一つはそのお同じフォルダから動かされるjavaプログラムです。 説明不足というかまだ触れてそんなにたってないのでソースを載せます class SampleManager { public static void main(String[] args){ exec obj= new exec(samlple1.java); obj.say(); } } class exec{ String phrase; exec(String phrase){ this.phrase=sample2.java; } void say(){ System.out.println(phrase); } } /////// public class samlple1 { public static String java; public static void exec(String[] args) {//execをした理由はSampleManagerにあるクラスexecを呼び出れるため System.out.println("Hello,World!")//この二つの出力結果を表示したい; System.out.println("こんにちは!"); } } ひとつのフォルダに上記のソースいれてSampleManager.java からsample.javaの出力結果の HelloWorld! こんにちは! を出力したいですがエラーはなく例外処理もありませんけど何故か出力結果はnullが返ってしまいます なぜでしょうか? アドバイスをお願いします

  • javaの参照渡しの問題

    javaの参照渡しの問題 javaの初心者で問題集で勉強しているのですが、 以下の問題の参照渡しの違いがわかりません。 ------------------------------------------- ソース1 class Samplea{ public void method(){ int b[] = new int[2]; set(b); System.out.println(b[0]); } public void set(int[] b){ b[0] = 30; } } class Sample{ public static void main(String srgs[]){ Samplea x = new Samplea(); x.method(); } } 実行結果 30 ------------------------------------------- ソース2 public class Test{ public static void main(String args[]){ String s1= "Hello"; String s2= "Good-Bye"; change(s1,s2); System.out.println(s1); } static void change(String s1,String s2){ s1 += ",Tom"; s1 = s2; } } 実行結果 Hello ------------------------------------------- 配列とString型は両方とも参照型なので ソース1の実行結果が「30」ならば、 ソース2の実行結果は「Good-Bye」になると思いました。 どなたか教えていただけないでしょうか。 宜しくお願いいたします。

    • ベストアンサー
    • Java
  • java 戻り値についての質問です。

     戻り値を使ったプログラムを作成したところエラーが出たのですが、どこを修正しなければならないのかわかりません。 [プログラム] public class Main31{ public static int add(int x, int y){ int ans = x + y; return ans; } public static void main(String[] args){ int ans = add(100 , 10); System.out.println(x +"+"+y+"="+ans); } } [エラーの内容] Main31.java:12: エラー: シンボルを見つけられません System.out.println(x +"+"+y+"="+ans);     ^ シンボル: 変数 x 場所: クラス Main31 Main31.java:12: エラー: シンボルを見つけられません System.out.println(x +"+"+y+"="+ans);      ^ シンボル: 変数 y 場所: クラス Main31 エラー2個 どこを直せば良いのかと、このプログラムだとエラーが出てしまう理由を教えてください。よろしくお願いいたします。

    • ベストアンサー
    • Java
  • コマンドラインで配列0~1番目入力したときは?

    使う言語はJava 例えばこんな感じで入力した場合、コマンドラインの配列0~1番目を入力したときコマンドラインでの配列1番目の文字列を値を出力するにはどうしたらいいのでしょうか? コマンドラインを使ってのサンプルソースがあんまり無かった為質問します。 まだまだ初心者脱却していないのでご指導ご鞭撻のほどお願いします。 お早い回答お待ちしています。 java Sample 2012年 1月 1月 考えたサンプルソースはこうです。 public class Ensyuu158 { /** * @param args */ public static void main(String[] args) { for(int i=0; i<args.length; i++){ if(args[i].equals(args[0])){ methodA(args[0]); }else if(args[i].equals(args[1])){ methodB(args[1]); } } }     //コマンドライン配列0~1番目が入力されたら1番目だけの文字列の値を出力する private static void methodB(String str) { System.out.println(str); }     //コマンドラインでの配列0番目が入力されたら0番目だけの文字列の値と文字列を出力したい private static void methodA(String str) { System.out.println(str+"月"); } } }

専門家に質問してみよう