Considérant que j'ai deux tableaux par exemple:
String[] array1 = new String[10];
int[] array2= new int[10];
Donc, dans une méthode, j'ai calculé deux tableaux, à savoir array1
& array2
Et maintenant, je veux renvoyer ces deux tableaux. Comment dois-je m'y prendre?
J'ai lu ici que je pouvais créer une autre classe, définir certains types d'objet et encapsuler ces tableaux dans le constructeur de cette classe, mais je suis toujours confus et ne comprend pas complètement.
Si vous pouviez me montrer un exemple de travail qui fait cela, ou peut-être une idée similaire, ce serait bien.
Vous pouvez réellement retourner quelque chose comme ceci aussi:
return new Object[]{array1, array2};
Et disons qu'en dehors de l'endroit où vous appelez cette méthode, votre objet retourné est obj
. Ensuite, accédez à array1 en tant que obj[0]
et accédez à array2 en tant que obj[1]
( le transtypage approprié sera nécessaire ).
Définissez un objet qui a du sens pour ce que vous essayez de retourner. Par exemple:
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.
}
Puis ailleurs:
return new Inventory(array2, array1);
=============================================
Remarques:
L'exemple ci-dessus n'est pas un bon exemple d'inventaire. Créez une classe d’élément décrivant un élément (identifiant, nom d’élément, etc.) et en stockant un tableau.
Si vos deux tableaux ne sont pas liés, la solution ci-dessus constitue une solution de contournement peu coûteuse. Idéalement, vous devez scinder le calcul et le retour des tableaux dans leur propre méthode.
Si les tableaux int/String représentent des paires clé/valeur, use peut alors utiliser une implémentation Map DST (http://download.Oracle.com/javase/6/docs/api/Java/util/Map.html) à la place et renvoyer cette. Vous pouvez parcourir les clés/valeurs si nécessaire.
Vous pouvez définir la classe Pair comme suit:
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; }
}
alors vous pouvez l'utiliser dans votre méthode:
public Pair someMethod()
{
String[] array1 = new String[10];
int[] array2 = new int[10];
// blah blah blah
return new Pair(array1, array2);
}
et vous pouvez utiliser votre méthode comme suit:
Pair pair = someMethod();
String[] arrayA = pair.getArray1();
int[] arrayB = pair.getArray2();
Utilisation de champs publics pour simplifier l’exemple. De la même manière qu'une méthode peut avoir le type de retour int
, vous pouvez définir votre méthode pour renvoyer un type de classe que vous avez défini.
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;
}
}
et ça?
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;
}
Vous pouvez y accéder plus tard comme ceci:
Object[] arrayObjects = ReturnArray();
String[] array1 = (String[])arrayObjects[0];
int[] array2= (int[])arrayObjects[1]
Si ces deux éléments sont liés, vous feriez mieux de renvoyer un Java.util.Map
, l'un en tant que clé et l'autre en tant que valeur, ou un Java.util.List
contenant des objets de votre propre création qui encapsulent ensemble les variables String
et int
.
Apache commonslang a Pair en version 3 (qui est en version bêta pour le moment).
Je recommanderais toujours d'utiliser des bibliothèques de confiance plutôt que de rouler les vôtres (même s'il ne s'agit que d'un tuple).
Il faudrait se demander pourquoi vous retournez deux valeurs, comment sont-elles liées. Généralement, dans cette situation, les valeurs sont liées et doivent être encapsulées dans un objet.
Utilisez new Object[]{array1, array2} to retun
.
retun new Object[]{array1,array2};
Et dans la méthode de l'appelant, vous obtiendrez l'objet renvoyé sous forme d'obj
int[] array1 = obj[0] ;
int[] array2 = obj[1];
Une Map
peut être utilisée. L'avantage d'utiliser Map
, on peut renvoyer autant de valeurs qu'il le souhaite. La mise en œuvre de cette idée dans le code ressemble à quelque chose comme:
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;
}
Ensuite, dans la fonction appelante, vous pouvez obtenir ces deux valeurs de Map
multiValues
en utilisant les clés - "array1", "array2":
String[] array1 = (String[]) multiValues.get("array1");
int[] array2 = (int[]) multiValues.get("array2");
Sur la base de votre commentaire, vous pouvez aborder ce problème de différentes manières.
Crée une classe représentant un utilisateur
Vous avez mentionné que vous travaillez avec un tableau 2D d'entiers, chaque ligne décrivant un seul utilisateur. Peut-être serait-il raisonnable d'avoir un objet décrivant chaque utilisateur.
class User {
String name;
int[] values;
// setters and getters for name, values
}
User[] doSomething() {
User[] users = new User[10];
// fill the array
return users;
}
Crée une classe représentant la valeur de retour complète
C'est bien si vous avez vraiment besoin des performances supplémentaires du tableau 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;
}