たとえば、2つの配列があるとします。
String[] array1 = new String[10];
int[] array2= new int[10];
つまり、メソッド内で2つの配列、つまりarray1
&array2
を計算しました。
次に、これらの両方の配列を返したいと思います。どうすればいいですか?
ここで、別のクラスを作成し、特定のオブジェクト型を定義し、これらの配列をそのクラスコンストラクターにカプセル化できることを読みましたが、それでも混乱し、完全には理解していません。
それを行う実際の例を示すことができれば、または同様のアイデアかもしれませんが、それは良いでしょう。
実際に次のようなものを返すこともできます:
return new Object[]{array1, array2};
そして、このメソッドを呼び出す場所の外で、返されるオブジェクトがobj
だとします。次に、array1にobj[0]
としてアクセスし、array2にobj[1]
としてアクセスします(適切なキャストが必要になります)。
返そうとしているものに対して意味のあるオブジェクトを定義します。例として:
public class Inventory {
private int[] itemNumbers; //array2
private String[] itemNames; //array1
public Inventory(int[] itemNumbers, String[] itemNames)
{
this.itemNumbers = itemNumbers;
this.itemNames = itemNames;
}
//Setters + getters. Etc.
}
次に、どこか他の場所に:
return new Inventory(array2, array1);
===============================================
ノート:
上記の例は在庫の良い例ではありません。アイテム(アイテムID、アイテム名など)を記述するアイテムクラスを作成し、それらの配列を格納します。
2つの配列が無関係の場合は、上記の方が安価な回避策です。理想的には、配列の計算と戻りを独自のメソッドに分割する必要があります。
Int/String配列がキー/値ペアを表す場合、代わりにMap DST実装(http://download.Oracle.com/javase/6/docs/api/Java/util/Map.html)を使用して返すことができます。それ。必要に応じてキー/値を反復できます。
Pairクラスは次のように定義できます。
public class Pair
{
private String[] array1;
private int[] array2;
public Pair(String[] array1, int[] array2)
{
this.array1 = array1;
this.array2 = array2;
}
public String[] getArray1() { return array1; }
public int[] getArray2() { return array2; }
}
それからあなたはあなたの方法でそれを使うことができます:
public Pair someMethod()
{
String[] array1 = new String[10];
int[] array2 = new int[10];
// blah blah blah
return new Pair(array1, array2);
}
そしてあなたはあなたの方法を次のように使うことができます:
Pair pair = someMethod();
String[] arrayA = pair.getArray1();
int[] arrayB = pair.getArray2();
例を簡単にするためにパブリックフィールドを使用する。メソッドがint
の戻り値の型を持つことができるのと同じように、定義したクラス型を返すようにメソッドを定義できます。
class MyPair{
public String[] StringArr;
public int[] IntArr;
}
class MyClass{
public MyPair Foo(){
MyPair pair = new MyPair();
pair.StringArr = new String[10];
pair.IntArr = new int[10];
return pair;
}
}
これはどうですか?
public Object[] ReturnArray()
{
String[] array1 = new String[10];
int[] array2= new int[10];
Object[] arrayObjects = new object[2];
arrayObjects [0] = array1;
arrayObjects [1] = array2;
return arrayObjects;
}
後でこのようにアクセスできます。
Object[] arrayObjects = ReturnArray();
String[] array1 = (String[])arrayObjects[0];
int[] array2= (int[])arrayObjects[1]
これら2つが関連している場合、おそらく、1つをキー、もう1つを値として、_Java.util.Map
_を返すか、String
とint
をカプセル化した独自の作成のオブジェクトを含む_Java.util.List
_を返すほうがよいでしょう。一緒。
使用する new Object[]{array1, array2} to retun
。
retun new Object[]{array1,array2};
そして、呼び出し元のメソッドでは、「obj」として返されたオブジェクトを取得し、次に取得します
int[] array1 = obj[0] ;
int[] array2 = obj[1];
Map
を使用できます。 Map
を使用する利点は、必要な数の値を返すことができることです。コードでのこのアイデアの実装は次のようなものです-
public Map returnMultipleValues(){
Map<String, Object> multiValues = new HashMap<String, Object>();
String[] array1 = new String[10];
int[] array2 = new int[10];
//populate and manipulate these two array
multiValues.put("array1", array1);
multiValues.put("array2", array2);
return multiValue;
}
次に、呼び出し元の関数で、「array1」、「array2」というキーを使用して、Map
multiValues
からこれら2つの値を取得できます。
String[] array1 = (String[]) multiValues.get("array1");
int[] array2 = (int[]) multiValues.get("array2");
あなたのコメントに基づいて、これに取り組むことができるいくつかの方法があります。
ユーザーを表すクラスを作成
整数の2D配列で作業しているとのことですが、各行は1人のユーザーを表しています。おそらく、各ユーザーを説明するオブジェクトを用意するのが妥当でしょう。
class User {
String name;
int[] values;
// setters and getters for name, values
}
User[] doSomething() {
User[] users = new User[10];
// fill the array
return users;
}
戻り値全体を表すクラスを作成します
これは、2Dアレイの追加のパフォーマンスが本当に必要な場合に適しています。
class UserData {
String[] names;
int[][] values;
// setters and getters for names, values
}
UserData doSomething() {
UserData userData = new UserData();
// set names and values
return userData;
}