web-dev-qa-db-fra.com

Comment renvoyer 2 valeurs d'une méthode Java?

J'essaie de renvoyer 2 valeurs à partir d'une méthode Java mais j'obtiens ces erreurs. Voici mon code:

// Method code
public static int something(){
    int number1 = 1;
    int number2 = 2;

    return number1, number2;
}

// Main method code
public static void main(String[] args) {
    something();
    System.out.println(number1 + number2);
}

Erreur:

Exception in thread "main" Java.lang.RuntimeException: Uncompilable source code - missing return statement
    at assignment.Main.something(Main.Java:86)
    at assignment.Main.main(Main.Java:53)

Résultat Java: 1

160
javaLearner.java

Au lieu de renvoyer un tableau contenant les deux valeurs ou d'utiliser une classe générique Pair, envisagez de créer une classe qui représente le résultat que vous souhaitez renvoyer et renvoyez une instance de cette classe. Donnez un nom significatif à la classe. Les avantages de cette approche par rapport à l'utilisation d'un tableau sont le type de sécurité et rendront votre programme beaucoup plus facile à comprendre.

Remarque: Une classe Pair générique, telle que proposée dans certaines des réponses ci-dessous, vous donne également la sécurité, mais ne donne pas ce que le résultat représente.

Exemple (qui n'utilise pas de noms vraiment significatifs):

final class MyResult {
    private final int first;
    private final int second;

    public MyResult(int first, int second) {
        this.first = first;
        this.second = second;
    }

    public int getFirst() {
        return first;
    }

    public int getSecond() {
        return second;
    }
}

// ...

public static MyResult something() {
    int number1 = 1;
    int number2 = 2;

    return new MyResult(number1, number2);
}

public static void main(String[] args) {
    MyResult result = something();
    System.out.println(result.getFirst() + result.getSecond());
}
214
Jesper

Java ne prend pas en charge les retours à valeurs multiples. Renvoie un tableau de valeurs.

// Function code
public static int[] something(){
    int number1 = 1;
    int number2 = 2;
    return new int[] {number1, number2};
}

// Main class code
public static void main(String[] args) {
  int result[] = something();
  System.out.println(result[0] + result[1]);
}
65
Matt

Vous pouvez implémenter un Pair générique si vous êtes sûr qu'il vous suffit de renvoyer deux valeurs:

public class Pair<U, V> {

 /**
     * The first element of this <code>Pair</code>
     */
    private U first;

    /**
     * The second element of this <code>Pair</code>
     */
    private V second;

    /**
     * Constructs a new <code>Pair</code> with the given values.
     * 
     * @param first  the first element
     * @param second the second element
     */
    public Pair(U first, V second) {

        this.first = first;
        this.second = second;
    }

//getter for first and second

puis demandez à la méthode de retourner que Pair:

public Pair<Object, Object> getSomePair();
38
Lars Andren

Vous ne pouvez renvoyer qu’une seule valeur en Java, la méthode la plus simple est la suivante:

return new Pair<Integer>(number1, number2);

Voici une version mise à jour de votre code:

public class Scratch
{
    // Function code
    public static Pair<Integer> something() {
        int number1 = 1;
        int number2 = 2;
        return new Pair<Integer>(number1, number2);
    }

    // Main class code
    public static void main(String[] args) {
        Pair<Integer> pair = something();
        System.out.println(pair.first() + pair.second());
    }
}

class Pair<T> {
    private final T m_first;
    private final T m_second;

    public Pair(T first, T second) {
        m_first = first;
        m_second = second;
    }

    public T first() {
        return m_first;
    }

    public T second() {
        return m_second;
    }
}
23
richj

Voici la solution vraiment simple et courte avec SimpleEntry:

AbstractMap.Entry<String, Float> myTwoCents=new AbstractMap.SimpleEntry<>("maximum possible performance reached" , 99.9f);

String question=myTwoCents.getKey();
Float answer=myTwoCents.getValue();

Utilise uniquement les fonctions intégrées Java et est livré avec le type avantage.

vous devez utiliser des collections pour renvoyer plusieurs valeurs de retour

dans votre cas, vous écrivez votre code comme

public static List something(){
        List<Integer> list = new ArrayList<Integer>();
        int number1 = 1;
        int number2 = 2;
        list.add(number1);
        list.add(number2);
        return list;
    }

    // Main class code
    public static void main(String[] args) {
      something();
      List<Integer> numList = something();
    }
5
GuruKulki

Utilisez un objet de type Pair/Tuple, vous n'avez même pas besoin d'en créer un si vous dépendez d'Apache commons-lang. Utilisez simplement la classe Pair .

4
UserF40
public class Mulretun
{
    public String name;;
    public String location;
    public String[] getExample()
    {
        String ar[] = new String[2];
        ar[0]="siva";
        ar[1]="dallas";
        return ar; //returning two values at once
    }
    public static void main(String[] args)
    {
        Mulretun m=new Mulretun();
        String ar[] =m.getExample();
        int i;
        for(i=0;i<ar.length;i++)
        System.out.println("return values are: " + ar[i]);      

    }
}

o/p:
return values are: siva
return values are: dallas
3
siva

Je suis curieux de savoir pourquoi personne n'a proposé la solution de rappel plus élégante. Ainsi, au lieu d'utiliser un type de retour, vous utilisez un gestionnaire transmis à la méthode en tant qu'argument. L'exemple ci-dessous présente les deux approches contrastées. Je sais lequel des deux est le plus élégant pour moi. :-)

public class DiceExample {

    public interface Pair<T1, T2> {
        T1 getLeft();

        T2 getRight();
    }

    private Pair<Integer, Integer> rollDiceWithReturnType() {

        double dice1 = (Math.random() * 6);
        double dice2 = (Math.random() * 6);

        return new Pair<Integer, Integer>() {
            @Override
            public Integer getLeft() {
                return (int) Math.ceil(dice1);
            }

            @Override
            public Integer getRight() {
                return (int) Math.ceil(dice2);
            }
        };
    }

    @FunctionalInterface
    public interface ResultHandler {
        void handleDice(int ceil, int ceil2);
    }

    private void rollDiceWithResultHandler(ResultHandler resultHandler) {
        double dice1 = (Math.random() * 6);
        double dice2 = (Math.random() * 6);

        resultHandler.handleDice((int) Math.ceil(dice1), (int) Math.ceil(dice2));
    }

    public static void main(String[] args) {

        DiceExample object = new DiceExample();


        Pair<Integer, Integer> result = object.rollDiceWithReturnType();
        System.out.println("Dice 1: " + result.getLeft());
        System.out.println("Dice 2: " + result.getRight());

        object.rollDiceWithResultHandler((dice1, dice2) -> {
            System.out.println("Dice 1: " + dice1);
            System.out.println("Dice 2: " + dice2);
        });
    }
}
2
Steve O 1969

À mon avis, le mieux est de créer une nouvelle classe dont le constructeur est la fonction dont vous avez besoin, par exemple:

public class pairReturn{
        //name your parameters:
        public int sth1;
        public double sth2;
        public pairReturn(int param){
            //place the code of your function, e.g.:
            sth1=param*5;
            sth2=param*10;
        }
    }

Ensuite, utilisez simplement le constructeur comme vous utiliseriez la fonction:

pairReturn pR = new pairReturn(15);

et vous pouvez utiliser pR.sth1, pR.sth2 comme "2 résultats de la fonction"

2
Jacob

Vous n'avez pas besoin de créer votre propre classe pour renvoyer deux valeurs différentes. Utilisez simplement un HashMap comme ceci:

private HashMap<Toy, GameLevel> getToyAndLevelOfSpatial(Spatial spatial)
{
    Toy toyWithSpatial = firstValue;
    GameLevel levelToyFound = secondValue;

    HashMap<Toy,GameLevel> hm=new HashMap<>();
    hm.put(toyWithSpatial, levelToyFound);
    return hm;
}

private void findStuff()
{
    HashMap<Toy, GameLevel> hm = getToyAndLevelOfSpatial(spatial);
    Toy firstValue = hm.keySet().iterator().next();
    GameLevel secondValue = hm.get(firstValue);
}

Vous avez même l'avantage de la sécurité de type.

2

Renvoyer un tableau d'objets

private static Object[] f () 
{ 
     double x =1.0;  
     int y= 2 ;
     return new Object[]{Double.valueOf(x),Integer.valueOf(y)};  
}
1
M.C.

Vous pouvez également envoyer des objets mutables en tant que paramètres. Si vous utilisez des méthodes pour les modifier, ils seront modifiés lorsque vous revenez de la fonction. Cela ne marchera pas avec des choses comme Float, car c'est immuable.

public class HelloWorld{

     public static void main(String []args){
        HelloWorld world = new HelloWorld();

        world.run();
     }



    private class Dog
    {
       private String name;
       public void setName(String s)
       {
           name = s;
       }
       public String getName() { return name;}
       public Dog(String name)
       {
           setName(name);
       }
    }

    public void run()
    {
       Dog newDog = new Dog("John");
       nameThatDog(newDog);
       System.out.println(newDog.getName());
     }


     public void nameThatDog(Dog dog)
     {
         dog.setName("Rutger");
     }
}

Le résultat est: Rutger

1
Andreas

Premièrement, il serait préférable que Java ait des n-uplets pour renvoyer plusieurs valeurs.

Deuxièmement, codez la classe Pair la plus simple possible ou utilisez un tableau.

Mais, si vous devez devez renvoyer une paire, réfléchissez au concept qu'elle représente (en commençant par ses noms de champs, puis son nom de classe) - et si elle est lue. un rôle plus important que vous ne le pensiez, et si cela aiderait votre conception globale à avoir une abstraction explicite pour cela. Peut-être que c'est un code hint...
Remarque: je ne le dis pas de manière dogmatique aidera, mais il suffit de regarder voir si c'est le cas ... ou si ce n'est pas le cas.

0
hyperpallium