web-dev-qa-db-ja.com

Javaのメソッドで2つの配列を返します

たとえば、2つの配列があるとします。

String[] array1 = new String[10];
int[] array2= new int[10];

つまり、メソッド内で2つの配列、つまりarray1array2を計算しました。
次に、これらの両方の配列を返したいと思います。どうすればいいですか?

ここで、別のクラスを作成し、特定のオブジェクト型を定義し、これらの配列をそのクラスコンストラクターにカプセル化できることを読みましたが、それでも混乱し、完全には理解していません。

それを行う実際の例を示すことができれば、または同様のアイデアかもしれませんが、それは良いでしょう。

18
Johnydep

実際に次のようなものを返すこともできます:

return new Object[]{array1, array2};

そして、このメソッドを呼び出す場所の外で、返されるオブジェクトがobjだとします。次に、array1にobj[0]としてアクセスし、array2にobj[1]としてアクセスします(適切なキャストが必要になります)。

42
anubhava

返そうとしているものに対して意味のあるオブジェクトを定義します。例として:

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)を使用して返すことができます。それ。必要に応じてキー/値を反復できます。

7
Uchikoma

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();
6
Eng.Fouad

例を簡単にするためにパブリックフィールドを使用する。メソッドが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;
  }
}
1
Babak Naffas

これはどうですか?

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]
1
Hector Sanchez

これら2つが関連している場合、おそらく、1つをキー、もう1つを値として、_Java.util.Map_を返すか、Stringintをカプセル化した独自の作成のオブジェクトを含む_Java.util.List_を返すほうがよいでしょう。一緒。

1
duffymo

Apache commonslang には、バージョン3(現時点ではベータ版)に Pair があります。

私は、(タプルのみであっても)自分のロールするよりも信頼できるライブラリを使用することを常に推奨します。

なぜ2つの値を返すのか、それらはどのように関連しているのかを尋ねる必要があります。通常、この状況では値は関連しており、オブジェクトにカプセル化する必要があります。

1
Tnem

使用する new Object[]{array1, array2} to retun

retun new Object[]{array1,array2};

そして、呼び出し元のメソッドでは、「obj」として返されたオブジェクトを取得し、次に取得します

int[] array1 = obj[0] ;
int[] array2 = obj[1];
0

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」というキーを使用して、MapmultiValuesからこれら2つの値を取得できます。

String[] array1 = (String[]) multiValues.get("array1");
int[] array2 = (int[]) multiValues.get("array2");
0
Razib

あなたのコメントに基づいて、これに取り組むことができるいくつかの方法があります。

  1. ユーザーを表すクラスを作成

    整数の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;
    }
    
  2. 戻り値全体を表すクラスを作成します

    これは、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;
    }
    
0
Wesley