【问题标题】:Return two arrays in a method in Java在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 数组的索引相同。所以稍后我可以根据需要从这个一维数组中引用字符串用户名。

标签: java arrays object linked-list


【解决方案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,它封装了一个String和int一起。

    【讨论】:

    • 谢谢,使用 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】:

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

        1. 创建一个代表用户的类

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

          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. 创建一个代表整个返回值的类

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-12-07
              • 1970-01-01
              • 1970-01-01
              • 2021-10-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-01-17
              相关资源
              最近更新 更多