- PR -

Java関数から配列を返せますか?

1
投稿者投稿内容
Mxfull
大ベテラン
会議室デビュー日: 2006/02/15
投稿数: 146
投稿日時: 2007-01-16 11:17
お世話になります。

Javaの関数から一次元や二次元の配列をリターン値として
返せますか?例えば、下記の?所は何をいれて行けますか?
    ??? func(int x[5][6])
{
return x;
}

宜しくお願いします
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2007-01-16 11:32
返す配列が1次元か2次元か決まってないってことですか?
決まってるなら
public int[] func()
でしょうけど。。。
そもそも
void func(int x[5][6])
ってコンパイル通ります??
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2007-01-16 11:39
はい。返せます。
配列を返すサンプルは色々とあると思うので、人のソースを見て勉強することをオススメします。

シンプルに答えを言えば、変数の宣言部などと同じく、型を記載すれば良いです。

int[][] func(int x[][]){
return x;
}
とすればコンパイルできますね。

配列の次元が決まっていないのであれば Object 型で返して呼び出し元でキャストする必要があります。
Object func(String x[][]){
if(true){
return new String[1];
}else{
return new String[2][2];
}
}
出来る限りコンパイル時に型を確定しておいてバグを減らそうと言う Java のコンセプトからすればあまりオススメしない方法ですが。

質問とは直接関係ありませんが、引数部の宣言で配列の長さを強制することはできないので "int x[5][6]" ではコンパイルが通らないと思います。
どうしても必要であれば assert をつかったり、範囲チェックをして IllegalArgumentException を投げるなどの工夫が必要になります。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-01-16 11:43
コード:
public static int[][] func(int[][] x) {
    return x;
}



int x[][];
int[][] x;
両方書けるのですが、x[][]といった記述はC言語と合わせるために
残された記法ですが、あまり使わないほうがよいでしょう。
配列も型と考えて、方は左に記述する慣習になっているはず。

また、初期化する際に
int x[][] = new int[5][6];
int[][] x = new int[5][6];
といった書き方になるので揃える意味合いでもint[][]とすべきでしょう。
Mxfull
大ベテラン
会議室デビュー日: 2006/02/15
投稿数: 146
投稿日時: 2007-01-17 10:45
ご回答有難うございます。

ちなみに、下記のようにコールしていいですか?

  int[][] m;
m=func(int[][] x);

また、下記のように定義すればだめですか?

  public int[][] func( )
{
int[][] x=new int[5][6];
return x;
}
宜しくお願いいたします。
ペンちゃん
ベテラン
会議室デビュー日: 2006/08/04
投稿数: 61
投稿日時: 2007-01-17 10:56
やってみれば結果は一目瞭然だと思いますが。

引用:

Mxfullさんの書き込み (2007-01-17 10:45) より:
ちなみに、下記のようにコールしていいですか?

  int[][] m;
m=func(int[][] x);



func関数を呼ぶのに引数に型は書かなくていいと思います。
引用:

また、下記のように定義すればだめですか?
  public int[][] func( )
{
int[][] x=new int[5][6];
return x;
}
宜しくお願いいたします。



その定義でいくと引数なしメソッドになるので前述の

引用:

m=func(int[][] x);



コード:
    m=func();



になるかと思います。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-01-17 11:07
「宜しくお願いいたします。」とはどういう意味ですか?
「私の代わりにコンパイルして結果を報告してください、宜しくお願いいたします。」
でしょうか。

記述の仕方について疑問をもたれるのはよいことですが、
せめてコンパイルできるかどうかぐらい試しましょう。

コンパイルできない記述は当然ながら駄目な記述です。
るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2007-01-17 11:08
るぱんです。

参考書買ってみてください。
ここで聞くより、すばやく終わりますよ。
コード:

ソース:
public class TEST{
public static void main(String args[]){
int[][] input = new int[5][6];
int[][] output;
TEST t = new TEST();

output = t.func(input);
for(int i = 0; i < 5; i++){
for(int j = 0; j < 6; j++){
System.out.println(output[i][j]);
}
}
}

public int[][] func(int[][] x ) {
x[0][0] = 0;
x[0][1] = 1;
x[0][2] = 2;
x[0][3] = 3;
x[0][4] = 4;
x[0][5] = 5;
x[1][0] = 10;
x[1][1] = 11;
x[1][2] = 12;
x[1][3] = 13;
x[1][4] = 14;
x[1][5] = 15;
x[2][0] = 20;
x[2][1] = 21;
x[2][2] = 22;
x[2][3] = 23;
x[2][4] = 24;
x[2][5] = 25;
x[3][0] = 30;
x[3][1] = 31;
x[3][2] = 32;
x[3][3] = 33;
x[3][4] = 34;
x[3][5] = 35;
x[4][0] = 40;
x[4][1] = 41;
x[4][2] = 42;
x[4][3] = 43;
x[4][4] = 44;
x[4][5] = 45;

return x;
}
}


コード:

実行結果:
C:\TEST>javac TEST.java

C:\TEST>java TEST
0
1
2
3
4
5
10
11
12
13
14
15
20
21
22
23
24
25
30
31
32
33
34
35
40
41
42
43
44
45

C:\TEST>



[ メッセージ編集済み 編集者: るぱん 編集日時 2007-01-17 11:11 ]
1

スキルアップ/キャリアアップ(JOB@IT)