Возвращает два массива в методе на языке Java


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

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

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

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

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

10 17

10 ответов:

На самом деле вы можете вернуть что-то вроде этого:

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

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

Примечания:

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

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

Если массивы int / String представляют пары ключ / значение, то use может использовать реализацию 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;
  }
}

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

Apache commons у lang естьПара в версии 3 (которая в данный момент находится в бета-версии).

Я бы всегда выступал за использование доверенных библиотек вместо сворачивания собственных (даже если это всего лишь кортеж).

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

А как насчет этого?

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. Создайте класс, представляющий пользователя

    Вы упомянули, что работаете с двумерным массивом целых чисел, где каждая строка описывает одного пользователя. Возможно, было бы разумно иметь объект, описывающий каждого пользователя.
    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. Создайте класс, представляющий все возвращаемое значение

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

    class UserData {
        String[] names;
        int[][] values;
    
        // setters and getters for names, values
    }
    
    UserData doSomething() {
        UserData userData = new UserData();
    
        // set names and values
    
        return userData;
    }
    

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

retun new Object[]{array1,array2};

И в вызывающем методе вы получите возвращаемый объект как "obj", а затем получите

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

A 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;

}

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

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