Вернуть два массива в методе в Java - PullRequest
17 голосов
/ 14 июня 2011

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

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

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

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

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

Ответы [ 10 ]

42 голосов
/ 14 июня 2011

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

return new Object[]{array1, array2};

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

7 голосов
/ 14 июня 2011

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

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) и вернуть ее. При необходимости вы можете перебирать ключ / значения.

6 голосов
/ 14 июня 2011

Вы можете определить класс 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();
1 голос
/ 14 июня 2011

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

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

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

1 голос
/ 14 июня 2011

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

1 голос
/ 14 июня 2011

что по этому поводу?

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 голос
/ 14 июня 2011

Использование открытых полей для простоты примера.Точно так же, как метод может иметь тип возврата 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;
  }
}
0 голосов
/ 09 февраля 2015

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");
0 голосов
/ 14 марта 2012

Использование new Object[]{array1, array2} to retun.

retun new Object[]{array1,array2};

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

int[] array1 = obj[0] ;
int[] array2 = obj[1];
0 голосов
/ 14 июня 2011

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

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