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

Posted

技术标签:

【中文标题】在Java中的方法中返回两个数组【英文标题】:Return two arrays in a method in Java 【发布时间】:2011-09-14 06:58:10 【问题描述】:

考虑到我有两个数组,例如:

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

所以在一个方法中我计算了两个数组,即array1 & array2 现在我想返回这两个数组。我应该怎么做?

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

如果您能向我展示一个可以做到这一点的工作示例,或者可能是任何类似的想法,那就太好了。

【问题讨论】:

您可能正在这里寻找不同的数据结构。两个数组中的值有什么关系?一个中的值是否对应于另一个中的值?是某种“缓存”还是可重用的“工作区”?通常,一个方法实际上只需要返回一个事物,因此了解一个方法为何试图同时返回两个事物是很有用的。 实际上是一个 int 类型的二维数组,而它的 [i] 索引将具有字符串用户名,该用户名将位于 String[] 数组中。这个 1D String 数组的索引将与 2D int 数组的索引相同。所以稍后我可以根据需要从这个一维数组中引用字符串用户名。 【参考方案1】:

为了简单起见,使用公共字段。与方法可以具有 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;
  

【讨论】:

【参考方案2】:

你实际上也可以返回这样的东西:

return new Object[]array1, array2;

假设在您调用此方法的外部,您返回的对象是obj。然后以obj[0] 访问array1 并以obj[1] 访问array2(需要正确的转换)。

【讨论】:

只是一个问题,那我的方法的返回类型应该是什么? 那我怎么用obj,我不能访问像obj[0][0]这样的数组值,这个答案没用【参考方案3】:

这个呢?

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]

【讨论】:

谢谢@Mr,你的想法和@anubhava一样,我已经在用了。【参考方案4】:

如果这两个是相关的,也许你最好返回一个java.util.Map,一个作为键,另一个作为值,或者一个包含你自己创建的对象的java.util.List,它封装了一个Stringint一起。

【讨论】:

谢谢,使用 Map 似乎是个好主意,但由于我不想陷入键值问题,所以我会坚持更幼稚的工作方式。 什么是“键值麻烦”?更天真可能不会那么好。您可以在这些原始值之上进行更好的抽象,您和此方法的客户就会变得更好。 OK 我的意思是 iv'e 学习更多。我感觉不舒服,但你是对的。 如果您正在进行关联数据访问,您可能应该按照@duffymo 的建议使用地图。它会为你省去很多麻烦和代码。【参考方案5】:

Apache commons lang 在版本 3 中具有 Pair(目前处于测试阶段)。

我总是提倡使用可信库而不是滚动你自己的库(即使它只是一个元组)。

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

【讨论】:

【参考方案6】:

您可以按如下方式定义 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; 

然后你可以在你的方法中使用它:

public Pair someMethod()

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

     // blah blah blah

     return new Pair(array1, array2);

你可以使用你的方法如下:

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

【讨论】:

谢谢,这是我最初的想法。你给出了一个非常清楚的理解如何做到这一点。【参考方案7】:

定义一个对您尝试返回的内容有意义的对象。举个例子:

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 数组表示键/值对,则可以使用 Map DST 实现 (http://download.oracle.com/javase/6/docs/api/java/util/Map.html)而是返回。您可以根据需要迭代键/值。

【讨论】:

【参考方案8】:

根据您的评论,您可以通过多种方式解决此问题。

    创建一个代表用户的类

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

    class User 
        String name;
        int[] values;
    
        // setters and getters for name, values
    
    
    User[] doSomething() 
         User[] users = new User[10];
    
         // fill the array
    
         return users;
    
    

    创建一个代表整个返回值的类

    如果您确实需要二维数组的额外性能,这很好。

    class UserData 
        String[] names;
        int[][] values;
    
        // setters and getters for names, values
    
    
    UserData doSomething() 
        UserData userData = new UserData();
    
        // set names and values
    
        return userData;
    
    

【讨论】:

【参考方案9】:

使用new Object[]array1, array2 to retun

retun new Object[]array1,array2;

在调用者方法中,您将返回对象为“obj”,然后获取

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

【讨论】:

【参考方案10】:

可以使用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;


然后在调用函数中,您可以通过使用键 - “array1”,“array2”从Map multiValues 获取这两个值:

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

【讨论】:

以上是关于在Java中的方法中返回两个数组的主要内容,如果未能解决你的问题,请参考以下文章

java中的方法理解

java 中方法的返回值String[] key, value ,问怎么理解 ~~

Java传入一个数组和返回一个数组

java 如何能在一个方法中返回多个值?

java实现一个类返回多个参数

JAVA如何比较两数组大小