Возвращение двух массивов в методе 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");