returnează două variabile dintr-o singură metodă (Programare, Java, String, Variabile, Metode, Return)

Lbert Hartanto a intrebat.

Cum să scriu corect următorul cod?

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);
}

A apărut următoarea eroare

movm cannot be returned.

Comentarii

  • Bună. Poate returna Map.Entry<String, String>, array de 2 șiruri, colecție de 2 elemente, trece containere ca parametri, etc. –  > Por nndru.
  • returnează ca un array. Deci semnătura metodei dvs. va fi public String[]...... De asemenea, @Reimeus a răspuns la întrebarea….. –  > Por ha9u63ar.
  • Vedeți asta : stackoverflow.com/questions/2832472/…  > Por Rajarshi Goswami.
  • În Java puteți returna doar o singură variabilă/obiect. Dacă doriți să returnați două obiecte String. vă recomand să le puneți într-o matrice, listă sau set și apoi să treceți returnarea acelui obiect. –  > Por Utilizator27854.
5 răspunsuri
ifloop

Când se utilizează Java 8 ați putea utiliza Perechea clasă.

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

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

În caz contrar, returnați pur și simplu o matrice.

Comentarii

  • Clasa pair face parte sau javafx. Se poate utiliza în SE? –  > Por Subhrajyoti Majumder.
  • @SubhrajyotiMajumder Începând cu JDK 7u6, JavaFX este inclus în pachetele JDK și JRE standard. –  > Por ifloop.
  • @DavidM. Sunt de acord cu tine. Mai ales atunci când se așteaptă cu nerăbdare modularizarea Java9, unde s-ar putea întâlni runtimes fără module UI instalate. O matrice sau o simplă clasă pojo ar putea fi mai elegantă. –  > Por ifloop.
Gil Moshayof

Nu puteți returna două valori diferite în metode în Java.

Atunci când apare această necesitate, aveți de obicei două opțiuni:

  1. Creați o clasă care are tipurile pe care doriți să le returnați și apoi returnați o instanță a acelei clase. De obicei, aceste clase sunt foarte simple, conțin membri publici și, opțional, un constructor pentru a iniția o instanță cu toate valorile necesare.
  2. Adăugați ca parametru al metodei un obiect de tip referință pe care metoda îl va muta cu valorile pe care doriți să le returnați. În exemplul dumneavoastră folosiți șiruri de caractere, deci acest lucru nu va funcționa, deoarece în Java șirurile de caractere sunt imuabile.

O altă opțiune ar fi utilizarea unui array de șiruri de caractere, deoarece ambele tipuri de returnare sunt șiruri. Ați putea folosi această opțiune ca valoare de returnare sau ca parametru care este modificat de metodă.

Editați: de obicei, metodele „toString” returnează doar un singur șir de caractere. Poate că ar trebui să luați în considerare concatenarea ambelor șiruri într-un singur șir folosind un separator. Exemplu:

return postn + "_" + movm;

Ashu

Există patru metode la care mă pot gândi pentru a implementa acest scenariu:

1. Utilizarea unei clase

Creați o clasă care să aibă toate atributele pe care doriți să le returnați, în cazul dumneavoastră poate fi

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;
   }    
}

și modificați metoda dvs. pentru a include obiectul acestei clase și pentru a seta valorile în aceste atribute. Schimbați tipul de returnare al metodei în numele clasei, de exemplu, Sample (Exemplu).

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. Utilizarea unei matrice

Modificați metoda pentru a returna un array String și stocați valorile în acest array:

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. Utilizarea javatuples

Puteți citi detalii la link-ul http://www.javatuples.org/

4. Prin delimitarea datelor

Puteți utiliza un anumit delimitator dacă sunteți sigur de datele din variabile. Dar acest lucru va necesita un spijin cu delimitatorul, atunci când doriți să utilizați aceste valori.

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;
}

user3913686

În Java, atunci când doriți ca o funcție să returneze mai multe valori, trebuie să

  • încorporați aceste valori într-un obiect pe care îl returnezi
  • sau să modificați un obiect care este transmis funcției dvs. ~ dystroy

Aveți două opțiuni (din câte știu eu) aici:

Opțiunea 1: Returnează ca o nouă matrice:

 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
     }

Opțiunea 2: returnează ca atare

Editat pentru a arăta get set

    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;
    }

cu metoda ta:

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()
     }

Comentarii

  • obj pare să fie în mare parte C#, totuși. –  > Por Henrik Aasted Sørensen.
  • o ilustrație frumoasă, dar poate doriți să vă numiți clasa dvs. Obj în loc de obj și să scrieți metodele getter și setter pentru a obține un exemplu compilabil 🙂 –  > Por GameDroids.
  • mulțumesc pentru comentarii, @Henrik, probabil pentru că java/c# sunt foarte asemănătoare (în plus, lucrez cu 99% c# :P) – user3913686
  • ObjClass pare destul de CShapry. Această întrebare este despre Java și, deoarece este o întrebare foarte simplă, acest răspuns este potențial foarte confuz. –  > Por Gil Moshayof.
  • probabil că ar fi fost suficient să le lăsăm publice 🙂 –  > Por Gil Moshayof.
Kent

puteți fie să creați un tip de înveliș, să îl instanțiați și să îl returnați, fie să returnați un Map sau List/Array.