在Java中的一个方法中返回两个数组

在Java中的一个方法中返回两个数组,java,arrays,object,linked-list,Java,Arrays,Object,Linked List,考虑到我有两个阵列,例如: String[] array1 = new String[10]; int[] array2= new int[10]; 因此,在一个方法中,我计算了两个数组,即array1和array2 现在我想返回这两个数组。我该怎么做呢 我在这里读到,我可以创建另一个类,定义某些对象类型,并在该类构造函数中封装这些数组,但我仍然感到困惑,并没有完全理解 如果您能给我一个这样做的工作示例,或者可能是任何类似的想法,这将是很好的。为了简化示例,请使用公共字段。与方法的返回类型为i

考虑到我有两个阵列,例如:

String[] array1 = new String[10];
int[] array2= new int[10];
因此,在一个方法中,我计算了两个数组,即
array1
array2

现在我想返回这两个数组。我该怎么做呢

我在这里读到,我可以创建另一个类,定义某些对象类型,并在该类构造函数中封装这些数组,但我仍然感到困惑,并没有完全理解


如果您能给我一个这样做的工作示例,或者可能是任何类似的想法,这将是很好的。

为了简化示例,请使用公共字段。与方法的返回类型为
int
的方式相同,您可以定义方法以返回已定义的类类型

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

实际上,您也可以返回如下内容:

return new Object[]{array1, array2};
假设在调用此方法的外部,返回的对象是
obj
。然后以
obj[0]
的身份访问阵列1,以
obj[1]
的身份访问阵列2(需要正确的铸造)。

这是怎么回事

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;
}
您可以稍后通过以下方式访问它们:

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

如果这两个是相关的,那么您最好返回一个
java.util.Map
,其中一个作为键,另一个作为值,或者返回一个
java.util.List
,其中包含您自己创建的对象,这些对象将
字符串和
int
封装在一起

我一直主张使用可信库而不是滚动自己的库(即使它只是一个元组)


有人可能会问,为什么要返回两个值,它们之间的关系如何。通常在这种情况下,值是相关的,应该封装在一个对象中。

您可以如下定义Pair类:

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; }
}
Pair pair = someMethod();
String[] arrayA = pair.getArray1();
int[] arrayB = pair.getArray2();
然后您可以在您的方法中使用它:

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

     // blah blah blah

     return new Pair(array1, array2);
}
您可以使用以下方法:

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; }
}
Pair pair = someMethod();
String[] arrayA = pair.getArray1();
int[] arrayB = pair.getArray2();

定义一个对您试图返回的内容有意义的对象。例如:

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.
}
然后在其他地方:

return new Inventory(array2, array1); 
===============================================

注:

上面的例子不是一个很好的库存例子。创建一个描述项(项id、项名称等)的项类,并存储这些项的数组

如果您的两个阵列不相关,那么上面的方法更便宜。理想情况下,您应该将数组的计算和返回拆分为它们自己的方法


如果int/String数组表示键/值对,那么use可以使用Map-DST实现(http://download.oracle.com/javase/6/docs/api/java/util/Map.html)取而代之的是把它还给我。您可以根据需要迭代键/值

根据您的评论,您可以通过多种方式来实现这一点

  • 创建一个代表用户的类

    您提到您正在使用一个二维整数数组,其中每一行描述一个用户。也许有一个对象来描述每个用户是合理的

    class User {
        String name;
        int[] values;
    
        // setters and getters for name, values
    }
    
    User[] doSomething() {
         User[] users = new User[10];
    
         // fill the array
    
         return users;
    }
    
  • 创建一个表示整个返回值的类

    如果您确实需要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;
    }
    

  • 使用
    新对象[]{array1,array2}重新运行

    retun new Object[]{array1,array2};
    
    在调用方方法中,您将得到返回的对象“obj”,然后得到


    可以使用
    Map
    。使用
    Map
    的优点是,可以返回任意多的值。这个想法在代码中的实现类似于——

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

    您可能在这里寻找不同的数据结构。两个数组中的值之间的关系是什么?其中一个中的值是否与另一个中的值相对应?一个是某种“缓存”还是可重用的“工作区”?通常,一个方法实际上只需要返回一件事,因此了解为什么一个方法试图同时返回两件事是很有用的。实际上,一个是int类型的二维数组,而它的[i]索引将具有字符串用户名,这些用户名将位于String[]数组中。此1D字符串数组的索引将与2D int数组的索引相同。所以以后我可以根据需要引用这个1D数组中的字符串用户名。谢谢,这是我最初的想法。谢谢,使用Map似乎是个不错的主意,但因为我不想陷入关键值的麻烦,所以我会坚持用更天真的方式来做这项工作。什么是“关键值的麻烦”?更天真的可能就没那么好了。你能在这些原始值的基础上进行更好的抽象,你和这个方法的客户就会变得更好。我觉得不舒服,但你是对的。如果你正在进行关联数据访问,你可能应该按照@duffymo的建议使用地图。它将为您节省大量的麻烦和代码。只是一个问题,那么我的方法的返回类型应该是什么?那么我如何使用obj,我无法访问像obj[0][0]这样的数组值,这个答案是无用的。谢谢@Mr,您的想法与@anubhava的想法相同,我已经在使用它了。