Возвращает два массива в методе на языке Java
Учитывая, что у меня есть два массива, например:
String[] array1 = new String[10];
int[] array2= new int[10];
Таким образом, внутри метода я вычислил два массива, а именно:array1
& array2
а теперь я хочу вернуть оба этих массива. Как мне это сделать?
Я читал здесь, что я могу создать другой класс и определить определенные типы объектов и инкапсулировать эти массивы в этом конструкторе класса, но я все еще запутан и не понял полностью.
Если бы вы могли показать мне рабочий пример, который делает это, или может быть любая подобная идея была бы хороша.
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]
Основываясь на вашем комментарии, есть несколько способов, которыми вы можете подойти к этому.
Создайте класс, представляющий пользователя
Вы упомянули, что работаете с двумерным массивом целых чисел, где каждая строка описывает одного пользователя. Возможно, было бы разумно иметь объект, описывающий каждого пользователя.class User { String name; int[] values; // setters and getters for name, values } User[] doSomething() { User[] users = new User[10]; // fill the array return users; }
Создайте класс, представляющий все возвращаемое значение
Это хорошо, если вам действительно нужна дополнительная производительность двумерный массив.
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");