• 締切済み

Java:arraycopyについて

問題集で次のプログラム(抜粋)について質問します。 char[] arrayA = {'a', 'b', 'c' , 'd', 'e' }; char[] arrayB= new char[arrayA.length]; System.arraycopy(arrayA, 1, arrayB, 0, 4); for( char c : arrayB){ System.out.print(c); } 結果として、bcdeが表示されるようですが、 arrayBのlengthは、arrayAのlengthと同じく5になっていると思います。 for文で代入される時に5つ目の要素としてnullが入ることは ないのでしょうか?

noname#225019
noname#225019
  • Java
  • 回答数1
  • ありがとう数0

みんなの回答

  • HNEX
  • ベストアンサー率62% (43/69)
回答No.1

charはプリミティブ型なのでnullは入りません。 必ず実数が入っています。 char[] arrayB= new char[arrayA.length]; の時点では配列が確保されただけなので、5の長さの配列にすべて0(charとしての表現としては空)が入っています 視覚的にわかりやすくかけばこういう状態です { '', '', '' , '', '' } arraycopyを実行した事で0-3までのインデックスにはbcdeが詰められるので  { 'b', 'c', 'd' , 'e', '' } となります 0が入っていることの確認としては System.out.println((int) arrayB[4]); としてみると0が出力される事が確認できます

関連するQ&A

  • x重入れ子の実装方法について

    ■やりたいこと: arrayA, arrayB, arrayCの配列から毎回それぞれ1つずつ取り出し、すべてのパタンをプリントする。 ■入れ子の階層が既知の場合: for文を入れ子にしていけばいいのですが(下記サンプルのように) ■入れ子の階層が未知な場合: どのように実装すればよいか、わかりません。 どなたかアドバイスいただけますか? ----------------------------- String[] arrayA = {"a1", "a2", "a3"}; String[] arrayB = {"b1", "b2"}; String[] arrayC = {"c1", "c2", "c3", "c4"}; int count = 1; for (int a = 0; a < arrayA.length; a++) { for (int b = 0; b < arrayB.length; b++) { for (int c = 0; c < arrayC.length; c++) { System.out.println(count + " : " + arrayA[a] + "-" + arrayB[b] + "-" + arrayC[c]); count += 1; } } } ------------------------ 上記ソースの出力: 1 : a1-b1-c1 2 : a1-b1-c2 3 : a1-b1-c3 以下省略

    • ベストアンサー
    • Java
  • arraycopy コンパイルエラー

    javaの勉強をしているのですが arraycopy()を使ったプログラムでエラーが出てしまいます。 class Ex97{ public static void main(String args[]){ int []a = new int[10]; int []b = new int[5]; for(int i=0; i<10; i++){ a[i] = (int)(Math.random()*10); } System.arraycopy(a, 2, b, 0, 5); for(int i=0; 0<a.length-1; i++){ System.out.println(a[i]); } System.out.println(""); for(int i=0; 0<b.length; i++){ System.out.println(b[i]); } } } /*メッセージ Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10 at Ex32.main(Ex32.java:13) */ このプログラムはaの3番目の要素から5つ分の内容をbへコピーする というものです。 ご回答よろしくお願いします。

    • ベストアンサー
    • Java
  • 【JAVA <identifier>がありませんについて教えて下さい】

    最近、会員登録させて頂いた佐藤と申します。 宜しくお願い致します。 最近、JAVAの勉強を行っており、簡単なプログラムを作ってみました。 コンパイルを行ったところ、以下のエラーメッセージが出力されます。 1.<identifier>がありません 2.')'がありません 2につきましては、自分でも調べてみましたが、'('と')'の数に間違いは無いと思います。 ソースは以下の通りです。 import java.io.*; public class testpgm {public static void main(String args[]) throws IOException {System.out.print("input data ==> "); //キーボードからの入力 BufferedReader buf = new BufferedReader(new InputStreamReader(System.in)); //入力データバッファの定義&代入 String data = buf.readLine(); char[] src = data.toCharArray(80); byte[] bytes= data.getBytes(); int i = 0; //int len = bytes.length; //文字数が81byte以上入力された場合はエラーメッセージ出力 if(80<bytes.length){System.out.print("入力文字数がオーバーしています");} else{ //文字種類と文字別の文字数を表示する for(int i = 0; i<src.length; i++){ if(src.char(i) == '\n'){ count++; } } System.out.print("output data ==> "); System.out.print(data); return; } } } エラーメッセージの対象となるのは エラー1 if(src.char(i) == '\n'){ ^ エラー2 } ^ (一番下の行から7行目) 初歩的な質問だと存じますが、理由をご存知の方は宜しくお願い致します。

  • 配列のコピーをして値を返したいが

    //配列のコピーをして値を返したい import java.util.*; public class Test7_22 { static int[] arrayClone(int[] a){ int[] b = new int[a.length]; for(int i =0;i>a.length;i++) b[i] = a[i];//ここで代入されるはず return b; } public static void main(String[]args){ Scanner std = new Scanner(System.in); System.out.print("要素数:"); int n = std.nextInt(); int[] a = new int[n]; for(int i=0;i<n;i++){ System.out.print("a["+i+"]="); a[i] = std.nextInt(); } int[] x = arrayClone(a); for(int i=0;i<a.length;i++) System.out.println("x["+i+"]="+x[i]); } } //コンパイルするとb[0] = 0になる

    • ベストアンサー
    • Java
  • プログラミングお願いします(JAVA)

    問題   キーボードから10回連続して入力し、そのデータを入力された順番とは逆順に一行で出力するプログラムを作成する 実行結果 ↓ 数値1>10 数値2>11 数値3>13   途中略 数値9>25 数値10>27 入力:10 11 13 15 17 19 21 23 25 27 逆順出力:27 25 23 21 19 17 15 13 11 10 ____________________________________________________________________________________________________ 自分がやったプログラミングですが、実行結果がうまくいきません。エラーは発生しないですけど、最後の入力と逆出力の出し方が実行結果のようにうまく表示させることができません。どうしたらいいでしょうか?? class Sample4 { public static void main(String[] args) throws IOException { System.out.println(""); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int[] test = new int[10]; for (int i = 0; i < 10; i++){ System.out.print("数値"+i+">"); String str = br.readLine(); int num =Integer.parseInt(str); test[i]=num; } for (int i = 0; i < 10/ 2; i++) { int t = test[i]; test[i] = test[10 - i - 1]; test[10 - i - 1] = t; } System.out.println("要素の並びを逆転しました."); for (int i = 0; i < 10; i++){ System.out.print("入力:"+test[i]); System.out.print("逆順出力:"+test[i]); } } }

  • JAVA初心者です。

    以下の文法でコンパイルエラーが出ます。 添削をお願いします。 import java.util.Random; public class Test{ public static void main(String[] args){ int n; for (n = 0; n < 200; n++){ int i; for (i = 0; i < 38; i++) { Random rnd = new Random(); int ran = rnd.nextInt(10); System.out.print(ran); System.out.print(" "); for (t = 0; t < 200; t++) } System.out.println(); } } }

    • ベストアンサー
    • Java
  • perlでの配列について

    配列の配列について教えてください。 以下のようなテキストから値を取得し、A,B,Cの値をそれぞれ別の配列に格納し、A,B,Cの平均値を出す処理を行っているとします。 ----- A=100 B=200 C=300 A=110 B=210 : ----- 現状、以下のような状態です。 @arrayA=(); @arrayB=(); @arrayC=(); : (テキストを読み込み) : ・読み込んだ行がA=XXXならarrayAにpush push(@arrayA,"100"); ・読み込んだっ行がB=XXXならarrayBにpush push(@arrayB,"100"); : (各配列の要素の平均値を出す) このやり方だと、グループが増えるとそのまま行数が増えて冗長なので、グループごとの配列を1つの配列にまとめたいのです。 Webで初期値を入れた形で説明しているのはよくみるのですが、今回のように空の配列に値をいれていくにはどうすればよいのでしょうか?(そもそも宣言の仕方もわかりません)。 また、配列の配列?とした場合、以下のような処理はできるのでしょうか? (1)配列の1つ目の要素(の配列)にpushする(現状でのarrayAにpushに該当) push(@arrayAll[0],"test");

  • ループ処理の際、最後だけ","をつけたくない

    for(int i = 0; i < a.length; i++){ System.out.print(a[i]+","); } 配列aの要素を並べて表示する時、System.out.print中に","をつけると、配列要素の最終部にまで , がついてしまいます。(・・・・43,3,98, のように) 最後だけ "," をつけたくない場合、どのように記述すればいいのでしょうか。

    • ベストアンサー
    • Java
  • H21年春期基本情報技術者午後問11(JAVA)

    H21年春期基本情報技術者午後問11(JAVA)で、 [プログラム2]の 引数textに格納される物が分かりません。 分かる方、教えて下さい。 //プログラム1 class GapBuffer { private static final int INITIAL_GAP_SIZE = 128; private char[] buffer; private int gapOffset = 0; private int gapSize = INITIAL_GAP_SIZE; GapBuffer(String initialText){ buffer = new char[initialText.length() + gapSize]; System.arraycopy(initialText.toCharArray(), 0, buffer, gapSize, initialText.length()); } void insert(int offset, char ch) { confirmGap(offset); buffer[gapOffset++] = ch; gapSize--; } void delete(int offset){ if (length() == 0) return; confirmGap(offset + 1); gapOffset--; gapSize++; } char charAt(int offset) { if (offset >= gapOffset) offset += gapSize; return buffer[offset]; } int length() { return buffer.length - gapSize ;} private void confirmGap(int newGapOffset){ if (gapSize == 0) { char[] temp = new char[buffer.length + INITIAL_GAP_SIZE]; System.arraycopy(buffer, 0, temp, 0, buffer.length); gapOffset = buffer.length; gapSize = INITIAL_GAP_SIZE; buffer = temp; } if(newGapOffset < gapOffset) { System.arraycopy(buffer, newGapOffset, buffer, newGapOffset + gapSize, gapOffset - newGapOffset); } else { System.arraycopy(buffer, gapOffset + gapSize, buffer, gapOffset, newGapOffset - gapOffset); } gapOffset = newGapOffset; } } /プログラム2 class Editor { private GapBuffer buf; private int cursor = 0; private Editor(String text) { buf = new GapBuffer(text);←此処です } private void run() { Display.output(buf, cursor); char ch; while ((ch = CharReader.get()) != CharReader.EOF) { switch (ch){ case CharReader.MOVE_FORWARD: moveCursor(1); break; case CharReader.MOVE_BACKWARD: moveCursor(-1); break; case CharReader.DELITE: if (cursor < buf.length()) { buf.delete(cursor); } break; default: buf.insert(cursor++, ch); break; } Display.output(buf, cursor); } } private void moveCursor(int n) { int newCursor = cursor + n; if (newCursor >= 0 && newCursor <= buf.length()) { cursor = newCursor; } } public static void main(String[] args) { Editor editor = new Editor(args[0]); editor.run(); } }

  • 拡張for文について質問

    以下は、拡張for文と配列に関するソースコードの一部を抜粋したものです。 それを見た上で、私の質問に答えてください。 int[]a={10,5,8,4,3}; for(int n:a){ System.out.print(n+" "); } int[][]a={{1,2},{4,5,6}}; for(int[]n:a){ for(int k:n){ System.out.print(k+" "); } System.out.println(""); } 質問1:何故、前者の配列は、『for(int n:a)』のように[]がついてなくても配列要素が取り出せるのに、後者の多次元配列は『for(int[]n:a){』のように『[]』がついた拡張for文を書いた上で、下にも拡張for文を書いた2重構造でないと配列要素を取り出せないのですか? 後者について『for(int n:a){』の文だけで多次元配列aの要素全て取り出せると思ってました。 因みに、配列変数には配列要素が入ってるのではなくて「参照」が入ってるのはわかってます。 このことと、何か関係があるのか、、?

    • ベストアンサー
    • Java