web-dev-qa-db-fra.com

Renvoie deux tableaux dans une méthode en Java

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.

17
Johnydep

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 ).

41
anubhava

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. 

7
Uchikoma

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();
6
Eng.Fouad

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;
  }
}
1
Babak Naffas

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]
1
Mr.

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.

1
duffymo

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.

1
Tnem

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];
0

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 MapmultiValues en utilisant les clés - "array1", "array2":

String[] array1 = (String[]) multiValues.get("array1");
int[] array2 = (int[]) multiValues.get("array2");
0
Razib

Sur la base de votre commentaire, vous pouvez aborder ce problème de différentes manières.

  1. 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;
    }
    
  2. 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;
    }
    
0
Wesley