Возвращение двух массивов в методе Java

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

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

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

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

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

Ответы

Ответ 1

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

return new Object[]{array1, array2};

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

Ответ 2

Определите объект, который имеет смысл для того, что вы пытаетесь вернуть. В качестве примера:

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 представляют пары ключ/значение, тогда использование может использовать реализацию DST Map (http://download.oracle.com/javase/6/docs/api/java/util/Map.html) вместо этого и вернуть это. При необходимости вы можете перебирать ключ/значения.

Ответ 3

Вы можете определить класс 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();

Ответ 4

Использование общедоступных полей для простоты примера. Точно так же метод может иметь возвращаемый тип 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;
  }
}

Ответ 5

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

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]

Ответ 6

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

Ответ 7

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

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

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

Ответ 8

Основываясь на вашем комментарии, вы можете подойти к этому.

  • Создать класс, представляющий пользователя

    Вы упомянули, что работаете с 2D-массивом целых чисел, где каждая строка описывает одного пользователя. Возможно, было бы разумно иметь объект, описывающий каждого пользователя.

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

Ответ 9

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

retun new Object[]{array1,array2};

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

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

Ответ 10

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