配列の確保方法について
- Javaで配列を動的に確保する方法についてです。
- C言語とは異なり、Javaではnew int[変数]という形式で確保することができます。
- 上記のプログラムはStringの配列からintの配列に変換するためのものです。
- ベストアンサー
new int[変数]で確保しても良いんですか?
Javaでの配列の確保の方法です。 int size = 100; int[] array = new int[size]; のような確保の方法はどの環境・コンパイラでも思い通りの動作をしてくれますか? C言語では、このような書き方で確保することはできなかったので、Javaでは可能なのか心配で質問しました。 「動的」という意味がまだ完全にわかっていないのですが、上記のような変数の確保は、動的とはいえないのですか?sizeの値をユーザーから受け取れば、確保する大きさはいつも違うようになると思うのですが・・・。 ちなみに下記のようなプログラムで配列の確保を使おうとしています。 static int[] toIntArray(String[] strs){ int[] array = new int[strs.length]; // ←ここで 確保しています。 for(int i = 0; i < strs.length; i++){ array[i] = Integer.valueOf(strs[i]).intValue(); } return array; } 上記のプログラムはStringの配列からintの配列に変換することを目的にしています。
- newtgecko
- お礼率88% (150/169)
- Java
- 回答数4
- ありがとう数4
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
問題ないです。 ちなみにC言語もC99からはできますよ。
その他の回答 (3)
- wormhole
- ベストアンサー率28% (1621/5657)
>あぁ, 「C99 にそもそも new はない」ですけどね>#1. 配列の要素数指定に変数が使えるという話であって、newが使えるとかいう話はしてませんが。 質問も読む限り、配列の要素数の指定の仕方の話ですし。 >Visul C++ 2010を使用していますが、コンパイルする前に、「size」の下に波線が出てエラー(内容:式には定数値が必要です)となります。 VisualC++はC言語としてはC90止まりのようです。
お礼
>VisualC++はC言語としてはC90止まりのようです。 Micro Softが提供しているので、最新の規格に合わせているものだと思っていました。 Javaで確保できれるかどうかが問題だったので、Javaではできるようなので良かったです。VC2012もC90止まりなのですかね。
- Tacosan
- ベストアンサー率23% (3656/15482)
本題ではないですが 「C言語では、このような書き方で確保することはできなかった」 とは, 具体的にはどのような書き方をしたのですか? あぁ, 「C99 にそもそも new はない」ですけどね>#1.
お礼
「このような書き方」とは、以下の様な書き方をしました。 int main(){ int size = 10; int array[size]; } Visul C++ 2010を使用していますが、コンパイルする前に、「size」の下に波線が出てエラー(内容:式には定数値が必要です)となります。 ですので、動的確保のときはmalloc()などを使います。 最近はJava、C++を学んだので、Vector、vectorを使ってます。
- teketon
- ベストアンサー率65% (141/215)
プログラムの実行時に決定されるなら、動的 コンパイル時に決定されるなら、静的 変数化しているかどうかはあまり重要ではありません。
お礼
以前お世話になりました。 追加の質問への返答有難う御座います。 例えば、new int[乱数] の形ならどうでしょうか? いくら擬似乱数でも、コンパイル時に判断できないと思うので、これは「動的確保」になりますか? また、new int[ユーザが入力した値]なども、動的になりますか?
関連するQ&A
- 動的に確保した配列のファイルへの書き出し
動的に確保した配列を、ファイルに書きだそうとしています。 int i, arraysize = 10; int **array; array = new int*[ arraysize ]; for (i = 0 ; i < arraysize ; i++) array[ i ] = new int [ arraysize ]; ofstream out("filename", ios::out | ios::binary); out.write((char *) array, sizeof( array )); これでは array のポインタが書き込まれるだけ、なのかな ? ということで、配列を書き込む目的を果たせておりません。このように動的に確保した多次元配列 (要素数は既知) をファイルに書き込むためにはどうすればよろしいでしょうか。
- 締切済み
- C・C++・C#
- C++ 動的確保について
学校の演習課題で「クラス Array のメンバ変数を以下のように変更して,配列のサイズを実行時に決められるようにしたい.コンストラクタを適切に修正しなさい.配列のサイズはコンストラクタの引数で指定できるようにすること.main 関数内のオブジェクトの宣言部分を適当に変更して動作を確認しなさい.」という課題が出ました。 指示のメンバ変数の変更は、sizeを定数にしていたものを変数にし、arrayを配列からポインタにする点です。 もとのプログラムはI、私がいじったものがIIです。どうにもセグメンテーションフォルトから抜け出せなくて困っています。どのようにしたら題意のプログラムになるのでしょうか? よろしくお願いします。 ここからI~ #include <iostream> using namespace std; class Array{ private: const static int size = 6; int array[size]; public: Array( ); int getSize( ); void put( int index, int data ); int get( int index ); void show( ); }; Array::Array( ) { for ( int i = 0; i < size; i++ ) { array[i] = 0; } } int Array::getSize( ) { return size; } void Array::put( int index, int data ) { array[index] = data; } int Array::get( int index ) { return array[index]; } void Array::show( ) { cout << "| "; for ( int i = 0; i < getSize( ); i++ ) { cout << get(i) << " | "; } cout << endl; } int main( ) { Array array1; array1.put(1, 2); array1.put(4, 1); array1.show( ); return 0; } ~ここまでI ここからII~ #include <iostream> using namespace std; class Array{ private: int size; int *array; public: Array(int s); ~Array(); int getSize(); void put(int index, int data); int get(int index); void show(); }; Array::Array(int s) { size = s; array = new int; for (int i = 0; i < size; i++) { *array = 0; array++; } array -= size; } Array::~Array() { delete[] array; cout << "デストラクタが呼ばれました。配列の要素数分のメモリを開放します." << endl; } int Array::getSize() { return size; } void Array::put(int index, int data) { *(array + index) = data; } int Array::get(int index) { return *(array + index); } void Array::show() { cout << endl << "| "; for (int i = 0; i < getSize(); i++) { cout << get(i) << " | "; } cout << endl; } int main() { int s = 0; cout << "確保するサイズを入力してください:"; cin >> s; Array array1(s); array1.put(1, 2); array1.put(4, 1); array1.show(); return 0; } ~ここまでII
- ベストアンサー
- C・C++・C#
- jspでの二次元配列
こんにちは。初めて質問させていただきます。よろしくお願いします。 現在javaで作ったプログラムをjspでも使えるようにしようと考えているのですが、 二次元配列がうまくjspで反映されず困っています。 jspに関してはほとんど無知で一から勉強している次第です。 そのためなるべく簡単に、と思い 以下のプログラムを、<% %>の間に入れるだけで動かせないかと思ったのですが エラーが出てしまいました。一次元の配列ならばできたのですが... ちなみに以下のプログラムはcsvファイルを読み込み、 多次元配列に格納していくというものです。 稚拙なプログラムで申し訳ありません... どなたかご教授いただければ幸いです。 import java.io.*; import java.util.StringTokenizer; import java.util.ArrayList; class Dog{ public static void main(String args[]) throws IOException{ String csv = "dognum.csv"; BufferedReader br = new BufferedReader(new FileReader(csv)); String[][] array = new String[100][]; int i = 0; while (true) { String line = br.readLine(); if(line==null) break; array[i] = line.split(","); i++; } for (i = 0; i < 101; i++) { for (int j = 0; j < array[i].length; j++) { System.out.println("["+i+"]["+j+"] = " + array[i][j]); } } } }
- 締切済み
- Java
- newを使った領域の動的確保
お世話になります。 C++での記述方法なのですが 構造体Testの領域を確保しておいて値を入れます。 確保しておいた領域では領域が不足するときに 不足分を追加したいのですがどうすればよいでしょう? Cではreallocを使えばよいと思うのですが C++ではmallocではなくnewを使ったほうがよいと聞きました。 newした領域を再定義した場合(deleteせずに領域を追加) 先に領域に入れたデータは保証されるのでしょうか? 以下例文ソース*部分 以下例文のソース Test *a; a = new TEST[10]; int cnt; int i; for(i = 0;i<10;i++){ //ここでTESTの配列aに値を入れる } cnt = 12; if( cnt > 10 ){ //予想サイズを上回ったら足りない分のサイズの領域を確保し //データを入れる a = new[cnt];//*ここで領域を再確保したら元のa[0]~a[9]の //データは確実に保持されるのか? //または他に領域を確保する方法があるのか? } 上記例文ソースでは先にcntで領域を確保すれば良いようにみえますが やりたいことは 先に確保されている領域を広げて 先に入れてあったデータと、広げた領域に入れたデータを使いたい のです。 分かりにくい文章かもしれませんがよろしくお願いします。
- ベストアンサー
- C・C++・C#
- java(バブルソート/単純挿入ソート)
以下のプログラムを「バブルソートもしくは単純挿入ソートのプログラムに変更しなさい」という課題が出ました。 どのようにすればよろしいでしょうか? import java.util.*; public class SelectSort { //プログラムクラス名 //整列プログラム public static void main(String[] args){ //整列用 int 型配列 int[] target; int elems = KeyboardInput.askInt("要素数? "); //配列を乱数で初期化する target = setArray(elems); //初期状態を表示 display(target); //整列メソッドの呼び出し sortArray(target); //整列結果の表示 display(target); } //配列を乱数で初期化するメソッド static int[] setArray(int elems){ // 要素数個の int 型変数の確保 int[] array = new int[elems]; //乱数利用ための宣言 Random generator = new Random(); //乱数の最大値・最小値 int max = 100; int min = 0; //generator.nextDouble() で 0から1までのdouble型乱数発生 for(int i=0 ; i<array.length ; i++) { array[i] = (int)((max-min)*(generator.nextDouble())+min); } return array; } //配列の状態を表示 static void display(int[] array){ for(int i=0 ; i<array.length ; i++) { System.out.print(array[i]+" "); } System.out.println(""); } static void sortArray(int[] array){ //配列のはじめから最後まで繰り返す for( int i = 0; i < array.length-1 ; i++){ int min_id = i; int min = array[i]; //範囲中でもっとも小さい要素を探す for( int j=i+1 ; j< array.length ; j++ ) { if( array[j] < min ){ min = array[j]; min_id = j ; } } //範囲の始めと置き換える int tmp = array[i]; array[i] = array[min_id]; array[min_id] = tmp; //display(array); } } }
- 締切済み
- Java
- 文字型数列をint型にするソースをコンパクトに。
/* 配列 data[] に含まれている数列を分解して、それぞれ分解したものをint型にしているものです。 しかし、もっとソースを短くできそうなソースなんですが、Listなどや色々考え実行はするものの、短くスマートものにはなりません。 良いソースがあればご提案ください。 よろしくおねがいします。 */ class Quad { public static void main (String[] args) { String[] strDigits = new String[20]; int[] intDigits = new int[20]; String[] data = new String[5]; data[0] = "0123"; data[1] = "4567"; data[2] = "8900"; data[3] = "1234"; data[4] = "5678"; char[] _digits01 = data[0].toCharArray(); char[] _digits02 = data[1].toCharArray(); char[] _digits03 = data[2].toCharArray(); char[] _digits04 = data[3].toCharArray(); char[] _digits05 = data[4].toCharArray(); int count = 0; while (count < 4) { strDigits[ 0 + count] = String.valueOf(_digits01[count]); strDigits[ 4 + count] = String.valueOf(_digits02[count]); strDigits[ 8 + count] = String.valueOf(_digits03[count]); strDigits[12 + count] = String.valueOf(_digits04[count]); strDigits[16 + count] = String.valueOf(_digits05[count]); count++; } count = 0; while (count < strDigits.length) { intDigits[0 + count] = Integer.parseInt("" + strDigits[0 + count]); count++; } }// main method eof. }// Quad class eof.
- ベストアンサー
- Java
- JAVAAppletの配列についてフィールドで宣言は?
はじめまして。よろしくお願いいたします! 私は、JavaAppletを始めたばかりで初心者です。 実は、学校の課題のJAVAAppletの配列についてなのですが 配列はフィールドで宣言できないのでしょうか? 例えば… public class RandomNumbers extends Applet{ int ave=0; int[ ] value; value = new int [8]; public void paint(Graphics g){ for (int i = 0; i < value.length; i++){ value[i] = (int)(Math.random()*10+1); g.drawString(String.valueOf(value[i]), 30+30*i, 30); } for(int j=0;j<value.length;j++){ ave = value[j]+ave; } g.drawString(String.valueOf(ave), 30, 60); } } 上記のように記述すると、「int[] value;」の「;」にエラーが発生してしまいます。 valueの配列の生成文には問題は発生しません。 課題ではinitメソッドを使用し、このほかにもメソッドを追加する必要があるのですが、他のメソッド内でvalueの配列は使うことは出来ないのでしょうか? 回答していただければ幸いです;;
- ベストアンサー
- Java
- javaの簡略for文の2次元配列
javaで以下のような簡略化されたfor文を使ったプログラムがあったとします String[] strs = new String[3]; strs[0] = "one"; strs[1] = "two"; strs[2] = "three"; for (String str : strs) { System.out.println(str); } 出力 one two three この簡略化されたfor文は2次元以上の配列にも対応しますか? 出来るのなら、どう書けばいいでしょうか?
- ベストアンサー
- その他(インターネット・Webサービス)
- 多次元配列のソートがうまくいかない
多次元配列のソートがうまくいかない 質問失礼します. 以下のような,String型,int型,double型の混在した多次元配列([3][3]の配列)をソートするプログラムを作成しました. このプログラムでは3番目の項目でソートを行っています. 問題点なのですが, 3番目の項目がdouble型の一桁(例えばarray[1][2]が2.0)ならばうまくソートできるのですが, 一つを2桁(例えばarray[1][2]を10.0)にすると何故か先頭の数(10.0の場合1)を基準にソートされてしまっているようです・・・ 配列へのデータの入れ方が間違っているのでしょうか? 原因がはっきりわからず困っているのですが, わかる方いましたらよろしくお願いします. public class Sort_test { /** * @param args */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ String[][] array = new String[3][3]; array[ 0 ][ 0 ] = "A"; array[ 0 ][ 1 ] = 2001+""; array[ 0 ][ 2 ] = 9.0+""; array[ 1 ][ 0 ] = "B"; array[ 1 ][ 1 ] = 1001+""; array[ 1 ][ 2 ] = 2.0+""; array[ 2 ][ 0 ] = "C"; array[ 2 ][ 1 ] = 3001+""; array[ 2 ][ 2 ] = 6.0+""; TheComparator comparator = new TheComparator(); // 3番目の項目でソートするように設定 comparator.setIndex( 2 ); // ソート実施 Arrays.sort( array, comparator ); dump(array); } public static void dump( String[][] array ) { for ( int i = 0;i < array.length;i++ ) { for ( int j = 0; j < array[ i ].length;j++ ) { System.out.print( "\t" + array[ i ][ j ] ); } System.out.println(); } } } //多次元配列ソート用クラス class TheComparator implements Comparator { /** ソート対象のカラムの位置 */ private int index = 0; /** ソートするためのカラム位置をセット */ public void setIndex( int index ) { this.index = index; } public int compare( Object a, Object b ) { String[] strA = ( String[] ) a; String[] strB = ( String[] ) b; return ( strA[ index ].compareTo( strB[ index ] ) ); } }
- ベストアンサー
- Java
- Javaで先頭の0を含め整数の桁数を取得したい
Javaで整数の桁数を取得したいのですが、 Scanner ids = new Scanner(System.in); int i = ids.nextInt(); String s = String.valueOf(i); int keta = s.length(); こうした場合に 12345678 と入力すれば8が取得できるのですが、 09876543 と入力したときに7と取得してしまいます。 先頭の0を無視せずに取得するにはどうすればよいでしょうか。 宜しくお願い致します。
- ベストアンサー
- Java
お礼
ご回答ありがとうございます。 C言語でもできるようになっていうるとは知りませんでした。 ちなみに、このような配列の確保は「動的確保」とはいわないのですか?size変数に合わせて、自由に確保しているように思えるのですが・・・