webentwicklung-frage-antwort-db.com.de

Geben Sie zwei Arrays in einer Methode in Java zurück

In Anbetracht meiner zwei Arrays zum Beispiel: 

String[] array1 = new String[10];
int[] array2= new int[10];

Ich habe also innerhalb einer Methode zwei Arrays berechnet, nämlich array1 & array2
und jetzt möchte ich beide Arrays zurückgeben. Wie soll ich vorgehen? 

Ich habe hier gelesen, dass ich eine andere Klasse erstellen und bestimmte Objekttypen definieren und diese Arrays in diesem Klassenkonstruktor einkapseln kann, aber ich bin immer noch verwirrt und habe nicht alles verstanden.

Wenn Sie mir ein Arbeitsbeispiel zeigen könnten, das dies tut oder eine ähnliche Idee sein könnte, wäre es gut.

17
Johnydep

Sie können so etwas auch tatsächlich zurückgeben:

return new Object[]{array1, array2};

Und sagen wir draußen, wo Sie diese Methode aufrufen, ist Ihr zurückgegebenes Objekt obj. Dann erhalten Sie Zugriff auf array1 als obj[0] und Zugriff auf array2 als obj[1] ( das richtige Casting wird benötigt ).

41
anubhava

Definieren Sie ein Objekt, das für das, was Sie zurückgeben möchten, Sinn macht. Als Beispiel: 

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

Dann woanders:

return new Inventory(array2, array1); 

================================================

Anmerkungen: 

Das obige Beispiel ist kein gutes Beispiel für eine Bestandsaufnahme. Erstellen Sie eine Elementklasse, die ein Element beschreibt (Element-ID, Elementname usw.), und speichern Sie ein Array davon. 

Wenn Ihre zwei Arrays nicht miteinander verwandt sind, ist das oben eher ein billiger Workaround. Im Idealfall sollten Sie die Berechnung und Rückgabe der Arrays in ihre eigene Methode aufteilen. 

Wenn die int/String-Arrays Schlüssel/Wert-Paare darstellen, kann use stattdessen eine Map DST-Implementierung (http://download.Oracle.com/javase/6/docs/api/Java/util/Map.html) verwenden und zurückgeben Das. Sie können nach Bedarf Schlüssel/Werte durchlaufen. 

7
Uchikoma

Sie können die Pair-Klasse wie folgt definieren:

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

dann können Sie es in Ihrer Methode verwenden:

public Pair someMethod()
{
     String[] array1 = new String[10];
     int[] array2 = new int[10];

     // blah blah blah

     return new Pair(array1, array2);
}

und Sie können Ihre Methode wie folgt verwenden:

Pair pair = someMethod();
String[] arrayA = pair.getArray1();
int[] arrayB = pair.getArray2();
6
Eng.Fouad

Verwendung öffentlicher Felder zur Vereinfachung des Beispiels. Auf dieselbe Weise wie eine Methode den Rückgabetyp int haben kann, können Sie Ihre Methode so definieren, dass sie einen von Ihnen definierten Klassentyp zurückgibt.

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

was ist damit?

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

Sie können später wie folgt darauf zugreifen:

Object[] arrayObjects = ReturnArray();
String[] array1 = (String[])arrayObjects[0];
int[] array2= (int[])arrayObjects[1]
1
Mr.

Wenn diese beiden verwandt sind, wäre es besser, wenn Sie einen Java.util.Map zurückgeben, einen als Schlüssel und den anderen als Wert oder einen Java.util.List, der Objekte Ihrer eigenen Schöpfung enthält, die eine String und eine int zusammenfassen.

1
duffymo

Apache commonslang hat Pair in Version 3 (die zur Zeit in der Beta ist).

Ich würde mich immer dafür einsetzen, vertrauenswürdige Bibliotheken zu verwenden, anstatt eigene zu rollen (auch wenn es nur ein Tuple ist).

Man müsste fragen, warum man zwei Werte zurückgibt, wie sie miteinander zusammenhängen. Im Allgemeinen sind die Werte in dieser Situation miteinander verbunden und sollten in einem Objekt verkapselt werden.

1
Tnem

Verwenden Sie new Object[]{array1, array2} to retun.

retun new Object[]{array1,array2};

Und in der Caller-Methode erhalten Sie das Objekt als "obj" zurückgegeben und erhalten es

int[] array1 = obj[0] ;
int[] array2 = obj[1];
0

Eine Map kann verwendet werden. Der Vorteil der Verwendung von Map, man kann beliebig viele Werte zurückgeben. Die Umsetzung dieser Idee in Code ist so etwas wie 

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;

}

In der aufrufenden Funktion können Sie diese beiden Werte von der MapmultiValues mit den Schlüsseln "array1", "array2" erhalten:

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

Basierend auf Ihrem Kommentar gibt es verschiedene Möglichkeiten, wie Sie dies angehen können.

  1. Erstellen Sie eine Klasse, die einen Benutzer darstellt

    Sie haben erwähnt, dass Sie mit einem 2D-Array von Ganzzahlen arbeiten, wobei jede Zeile einen einzelnen Benutzer beschreibt. Vielleicht wäre es sinnvoll, ein Objekt zu haben, das jeden Benutzer beschreibt.

    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. Eine Klasse erstellen, die den gesamten Rückgabewert darstellt

    Dies ist gut, wenn Sie wirklich die zusätzliche Leistung des 2D-Arrays benötigen.

    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