it-roy-ru.com

Вернуть два массива в методе в Java

Учитывая, что у меня есть два массива, например: 

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

Так что внутри метода я вычислил два массива, а именно array1 & array2
и теперь я хочу вернуть оба этих массива. Как я должен идти об этом? 

Я прочитал здесь, что я могу создать другой класс, определить определенные типы объектов и инкапсулировать эти массивы в конструкторе этого класса, но я все еще растерялся и не понял полностью.

Если бы вы могли показать мне рабочий пример, который делает это, или, может быть, есть какая-то похожая идея, это было бы хорошо.

17
Johnydep

Вы также можете вернуть что-то вроде этого:

return new Object[]{array1, array2};

И скажем, вне того, где вы вызываете этот метод, ваш возвращаемый объект - obj. Затем получите доступ к массиву 1 как obj[0] и получите доступ к массиву 2 как obj[1] ( потребуется правильное приведение ).

41
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); 

===============================================

Заметки: 

Приведенный выше пример не является хорошим примером инвентаря. Создайте класс элемента, который описывает элемент (идентификатор элемента, имя элемента и т.д.), И сохраните их массив. 

Если ваши два массива не связаны, то вышеприведенный вариант скорее дешевый обходной путь. В идеале, вы должны разделить вычисление и возврат массивов в их собственный метод. 

Если массивы 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
Mr.

Если эти два взаимосвязаны, возможно, вам лучше вернуть Java.util.Map, один из которых является ключом, а другой - значением, или Java.util.List, содержащий объекты вашего собственного создания, которые объединяют вместе String и int.

1
duffymo

Apache commonslang has Pair в версии 3 (которая в настоящее время находится в бета-версии).

Я всегда рекомендовал бы использовать доверенные библиотеки, а не свои собственные (даже если это только Tuple).

Можно было бы спросить, почему вы возвращаете два значения, как они связаны. Обычно в этой ситуации значения связаны и должны быть заключены в объект.

1
Tnem

Используйте new Object[]{array1, array2} to retun.

retun new Object[]{array1,array2};

И в вызывающем методе вы получите возвращенный объект как «объект», а затем получить

int[] array1 = obj[0] ;
int[] array2 = obj[1];
0
phalgun kumar dandu

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;

}

Затем в вызывающей функции вы можете получить эти два значения из MapmultiValues, используя ключи - "array1", "array2":

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

Исходя из вашего комментария, есть несколько способов, которыми вы можете подойти к этому.

  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