从方法返回两个数组

时间:2011-02-21 14:59:07

标签: java java-ee

我想从一个方法(填充这些数组)返回两个String数组。两个阵列的大小彼此不同。我该怎么办?

String[] namesOfColumnsFound = new String[45];

String[] namesOfColumnsNotFound = new String[25];

编辑:我只需要传递数据..不需要传递任何行为

9 个答案:

答案 0 :(得分:6)

创建一个包含两个数组而不是某个集合组合的对象。为什么?

  1. 如果更改返回组合,它将使重构变得更容易。您不必更改List<Array<...>>
  2. 的实例
  3. 您可以将行为封装在该对象中。您的客户可以询问第一个数组,第二个数组等的返回对象。更好的是,他们可以使用这些数组请求返回对象执行操作而不是将它们拉出来。这就是OO的本质 - 告诉对象为你做事,而不是让他们告诉你它们是由组成的。
  4. e.g。

    public class ReturnType {
       private Array<String> first = ...
       private Array<String> second = ...
    
       public boolean isValid() { ... }
       public void doSomethingCleverWithReturnValues() { ... }
    }
    
    public ReturnType giveMeTwoArrays() {
       ...
       return new ReturnType(...)
    }
    

    真的真的很容易做一些简单的事情(例如返回一个元组或一个集合组合),但与上面做的相比,重构的痛苦是相当大的(我说的是刚刚犯了这个错误的经验刚才这个!那就是使用Scala - 类型推断让生活更简单,而且还是一种痛苦)

答案 1 :(得分:3)

或者创建一个包含两个数组的简单包装器。

示例:

class ArrayHelper{
    private String[] strArr1;
    private String[] strArr2; 
    ... [constructor that sets both arrays and getters to access them]
};

答案 2 :(得分:2)

您可以返回包含两个元素的列表。 list [0]将是你的第一个字符串数组,list [1]将是第二个。

答案 3 :(得分:2)

这是另一种做法

return  (new Object[] { obj1 ,obj2 });

return  Arrays.asList(obj1,obj2);

return(new Object [] {obj1,obj2});

回报大小

class xx
{
public static void main (String[] args)
{   
...
Object[] receiver = m();
System.out.println(receiver.length);  //  size is 2
}
public static Object[] m()
{
String m ="suresh";
return  (new Object[] { m ,new ArrayList().add("PEPE") });
}

答案 4 :(得分:1)

您可以返回两个数组的数组(即使它们的长度不同)。数组列表也可以使用。 “最干净”的解决方案是使用某种类型的Tuple(有www.javatuples.org,但服务器现在似乎已经关闭了)

<强> [编辑]

有几种方法可以制作数组数组,例如

public int[][] method() {
   int[] array1 = new int[]{1,2,3,4};
   int[] array2 = new int[]{10,20,30};
   int[][] result = new int[]{array1, array2};
   return result;
}

答案 5 :(得分:1)

这是我的两分钱:我避免从方法返回语言对象(如String,int,String [],arraylist,map等)。我相信我所写的内容应该是商业术语以便于阅读,更重要的是,将代码与手头的问题联系起来。

我将如何编写它(测试代码):

            ColumnAnalyzer ca = new ColumnAnalyzer();

        ca.analyze();

        System.out.println(ca.getNamesOfColumnsFound().length) ;

        System.out.println(ca.getNamesOfColumnsNotFound().length) ;

当然应更改名称ColumnAnalyzer和方法analyze()以反映业务系统术语。

答案 6 :(得分:0)

你也可以返回一个包含两个数组的Object,甚至可能还有一些逻辑如何使用数组。

很简单的例子:

public class Result {
   public String[] array1;
   public String[] array2;
}

Result result = new Result();
result.array1 = xyz;
...

最好将有关array1和2的一些逻辑放入Object:

public class Result {
   private String[] array1;
   private String[] array2;
   public Result(String[] array1, String[] array2) {
      this.array1 = array1;
      this.array2 = array2;
   }

   // now some business logic like this, or just return the arrays with getters
   public int getArray1Size() {
   }
}

答案 7 :(得分:0)

虽然这并没有完全解决你使用两个数组的问题,但这是我将如何处理它

public Map<String,Boolean> analyzeColumns(SomeStructure struct) {
    Map<String,Boolean> columnName2found = new HashMap<String,Boolean>();
    for(PotentialColumn pc : struct) {
        String name = pc.getName();
        boolean found = pc.isFound();
        columnName2found.put(name,found);
    }
    return columnName2Found;
}


// in action
Map<String,Boolean> columnName2found = anaylzeColumns(struct);

for(Map.Entry<String,Boolean> entry : columnName2found.entrySet()) {
    if(entry.getValue()) handleFound(entry.getKey());
    else handleNotFound(entry.getKey());
}

答案 8 :(得分:0)

您还可以使用更“通用”的包装器对象:

public class Tuple<A, B>{
    private A a;
    private B b;

    public Tuple(A a, B b) {
        this.a = a;
        this.b = b;
    }
    public A getFirst(){return a;}
    public B getSecond(){return b;}
}