web-dev-qa-db-fra.com

retourne deux variables d'une méthode

Comment écrire correctement le code suivant?

public String toString(int[] position, int xOffset, int yOffset) {
    String postn = String.format("[%d,%d]", position[0], position[1]);
    String movm = String.format("[%d,%d]", xOffset, yOffset);

    return (postn, movm);
}

L'erreur suivante s'est produite

movm cannot be returned.
11
Lbert Hartanto

Lorsque vous utilisez Java 8 , vous pouvez utiliser la classe Pair .

private static Pair<String, String> foo (/* some params */) {
    final String val1 = "";  // some calculation
    final String val2 = "";  // some other calculation

    return new Pair<>(val1, val2);
}

Sinon, renvoyez simplement un tableau.

30
ifloop

Il y a quatre méthodes auxquelles je peux penser pour implémenter ce scénario:

1. Utiliser une classe

Créez une classe avec tous les attributs que vous souhaitez renvoyer, dans votre cas cela peut être

public class Sample {
   private String postn;
   private String movm;
   public String getPostn() {
        return postn;
   }
   public void setPostn(String postn) {
    this.postn = postn;
   }
   public String getMovm() {
       return movm;
   }
   public void setMovm(String movm) {
       this.movm = movm;
   }    
}

et modifiez votre méthode pour inclure l'objet de cette classe et définissez les valeurs dans ces attributs. Modifiez le type de retour de la méthode en nom de classe, par exemple Échantillon

public Sample toString(int[] position, int xOffset, int yOffset) {
    String postn = String.format("[%d,%d]", position[0], position[1]);
    String movm = String.format("[%d,%d]", xOffset, yOffset);
    Sample obj = new Sample();
    obj.setPostn(postn);
    obj.setMovm(movm);
    return obj;
}

2. Utilisation d'un tableau

Modifiez la méthode pour renvoyer le tableau String et stockez les valeurs dans ce tableau:

public String[] toString(int[] position, int xOffset, int yOffset) {
    String postn = String.format("[%d,%d]", position[0], position[1]);
    String movm = String.format("[%d,%d]", xOffset, yOffset);
    String arr[] = new String[2];
    arr[0] = postn;
    arr[1] = movm;
    return arr;
}

3. Utilisation de javatuples

Vous pouvez lire les détails sur le lien http://www.javatuples.org/

4. En délimitant les données

Vous pouvez utiliser un délimiteur si vous êtes sûr des données des variables. Mais cela nécessitera un crachement avec le délimiteur, lorsque vous souhaitez utiliser ces valeurs.

public String toString(int[] position, int xOffset, int yOffset) {
    String postn = String.format("[%d,%d]", position[0], position[1]);
    String movm = String.format("[%d,%d]", xOffset, yOffset);
    return postn+"~"+movm;
}
4
Ashu

Vous ne pouvez pas renvoyer deux valeurs différentes dans des méthodes en Java.

Lorsque ce besoin se produit, vous avez généralement deux options:

  1. Créez une classe contenant les types que vous souhaitez renvoyer, puis renvoyez une instance de cette classe. Généralement, ces classes sont très basiques, contiennent des membres publics et éventuellement un constructeur pour initier une instance avec toutes les valeurs requises.
  2. Ajoutez un objet de type référence en tant que paramètre à la méthode que la méthode va muter avec les valeurs que vous souhaitez renvoyer. Dans votre exemple, vous utilisez des chaînes, et cela ne fonctionnera donc pas car dans Java sont immuables.

Une autre option serait d'utiliser un tableau de chaînes, car vos deux types de retour sont des chaînes. Vous pouvez utiliser cette option comme valeur de retour ou comme paramètre modifié par la méthode.

Edit: généralement les méthodes "toString" ne renvoient qu'une seule chaîne. Vous devriez peut-être envisager de concaténer vos deux chaînes en une seule chaîne à l'aide d'un séparateur. Exemple:

return postn + "_" + movm;
4
Gil Moshayof

En Java, lorsque vous souhaitez qu'une fonction renvoie plusieurs valeurs, vous devez

  • intégrer ces valeurs dans un objet que vous retournez
  • ou modifiez un objet qui est passé à votre fonction ~ dystroy

Vous avez deux options (que je sache) ici:

Option 1: retournez comme un nouveau tableau:

 public String[] toString(int[] position,int xOffset,int yOffset) {
        String postn=String.format("[%d,%d]",position[0],position[1]);
        String movm=String.format("[%d,%d]",xOffset,yOffset);

        string [] myArray = new string[2];
        myArray[0] = postn;
        myArray[1] = movm;

        return myarray; //returns as array
     }

Option 2: retour en tant que tel

Modifié pour afficher la configuration

    private String a;
    private String b;

    public void setPostN(String s)
    {
            a= s;
    }

    public String getPostN()
    {
            return a;
    }

    public void setMovm(String s)
    {
            a= s;
    }

    public String getMovm() 
    {
            return a;
    }

avec votre méthode:

public void toString(int[] position,int xOffset,int yOffset) {
        String postn=String.format("[%d,%d]",position[0],position[1]);
        String movm=String.format("[%d,%d]",xOffset,yOffset);

        setPostN(postn);
        setMovm(movm);

       //no return, but available via calling getMovm() or getPostN()
     }
2
user3913686

vous pouvez soit créer un type wrapper, instancier et le renvoyer, soit renvoyer une carte ou une liste/un tableau.

1
Kent