Java:如何实现一个需要2个数组并返回2个数组的方法?

时间:2010-05-04 16:55:36

标签: java

好的,这就是我想要做的事情:

我想为数组实现交叉方法。

它应该采用2个相同大小的数组并返回两个新数组,它们是两种输入数组的混合。 如[a,a,a,a] [b,b,b,b] ------> [a,a,b,b] [b,b,a,a]。

现在我想知道在Java中建议的方法是什么,因为我不能返回多个值。

我的想法是: - 返回包含两个新数组的Collection(或数组)。

我真的不喜欢那个,因为它认为会导致更难理解代码。 - 通过为每个案例调用方法,但每次仅获取一个结果,无需返回两个结果。

我也不喜欢那个,因为没有关于应该返回哪个解决方案的自然顺序。这需要指定,但导致更难理解代码。

另外,这只适用于这种基本情况,但我希望在交叉之前对数组进行洗牌,然后再将其反转。因为我不想实际操作,所以我无法进行与交叉隔离的混洗,相反,我想在进行交叉时使用有关置换的信息,这将是一种更有效的方式。

我的问题不是关于算法本身,而是关于在Java中输入方法(关于输入和输出)的方法

10 个答案:

答案 0 :(得分:11)

根据Bruce Eckel的书 Thinking in Java 的建议,在我的Java项目中,我经常包含一些实用程序类,用于包装两个或三个对象的组。它们非常简单方便,特别适用于必须返回多个对象的方法。例如:

public class Pair<TA,TB> {
    public final TA a;
    public final TB b;

    /**
     * factory method
     */
    public static <TA,TB> Pair<TA,TB> createPair(TA a,TB b ){
        return new Pair<TA,TB>(a,b);
    }

    /**
     * private constructor - use instead factory method 
     */
    private Pair(final TA a, final TB b) {
            this.a = a;
            this.b = b; 
    }

    public String toString() {  
        return "(" + a + ", " + b + ")";
    }

}

答案 1 :(得分:6)

阅读本文的最后一部分:

http://www.yoda.arachsys.com/java/passing.html

引用:

  

这是经过的真正原因   在许多情况下使用引用 - 它   允许一种方法有效地拥有   许多回报值。 Java不允许   多个“真实”的返回值,以及它   不允许通过引用传递   将在其他中使用的语义   单一返回值语言。   但是,这里有一些技巧   解决这个问题:

     
      
  1. 如果您的任何返回值是表示成功或的状态代码   方法失败,消除它们   立即。替换它们   异常处理抛出一个   例如,如果方法没有   顺利完成。例外   是一种更标准的处理方式   错误的条件,可以更多   表达,并消除你的一个   返回值。

  2.   
  3. 查找相关的返回值组,并将其封装到   包含每一块的对象   信息作为字段。的课程   这些对象可以扩展为   稍后将其行为封装到   进一步完善了设计   码。每套相关的回报   您封装到的值   object从中删除返回值   方法通过提高水平   抽象方法的界面。   例如,而不是通过   通过参考协调X和Y.   允许他们返回,创建一个   可变Point类,传递一个对象   按值引用,并更新   方法中对象的值。

  4.   

作为奖励,此部分由Jon Skeet更新:)

答案 2 :(得分:5)

如果调用者提前知道返回数组的大小是合理的,可以将它们传递给方法:

     public void foo(Object[] inOne, Object[] inTwo, Object[] outOne, Object[] outTwo) {
            //etc.
     }

话虽如此,90%以上的时间方法中的多个返回值隐藏了更好的设计。我的解决方案是在对象内部进行转换:

     public class ArrayMixer {
           private Object[] one;
           private Object[] two;
           public ArrayMixer(Object[] first, Object[] second) {
                //Mix the arrays in the constructor and assign to one and two.
           }
           public Object[] getOne() { return one; }
           public Object[] getTwo() { return two; }
     }

我怀疑在你的实际用例中,类和数组1和数组2可以得到更好的名称。

答案 3 :(得分:3)

由于你的方法的规范是它需要两个输入数组并产生输出数组,我同意你的意思是该方法应该同时返回两个数组。

我认为返回值最自然的选择是长度为2的int[][](替换int,无论您使用何种类型)。我认为没有任何理由可以使代码更难理解,特别是如果你指定返回值的内容将会是什么。

修改:为了回应您的评论,我知道您已经考虑过这一点,我说尽管您有风格反对意见,但我认为没有严格的“更好”选择(“更好“这里问题中的松散定义。”

另一种方法,大致相当于这一方法,将定义一个包装两个数组的对象。这具有很小的区别,能够通过名称而不是数组索引来引用它们。

答案 4 :(得分:3)

最好的方法是做

public void doStuff(int[] array1, int[] array2) {
    // Put code here
}

由于Java中的Java数组传递了引用,因此对数组所做的任何修改都将对数组本身进行。这有几个警告

  1. 如果要将其设置为null,则必须使用其他方式(例如将其封装在对象中)
  2. 如果要初始化数组(在方法中),则必须使用不同的方式
  3. 您可以使用以下格式:

    // other method
    int[] array1 = new int[20];  // the arrays can be whatever size
    int[] array2 = new int[20];
    
    doStuff(array1,array2);
    
    // do whatever you need to with the arrays
    

    编辑:这假设可以对输入数组进行更改。

    如果不是,那么一个对象(例如leonbloy的回答肯定是所要求的)。

答案 5 :(得分:0)

您严格地无法在Java中返回多于一个值(思考对象或原语)。也许你可以返回一个特定“Result”对象的实例,该对象有两个数组作为属性?

答案 6 :(得分:0)

您可以将输出数组作为参数传递给方法。这可以让您更好地控制阵列的内存分配。

答案 7 :(得分:0)

最简洁和最容易理解的方法是创建一个包含两个数组的容器bean,并从该方法返回容器。我可能也会将容器传入方法,以保持对称。

假设两个数组的长度相同,最有效的内存方式是传递一个多维数组 - Object [2] [n] - 其中n是数组的长度。

答案 8 :(得分:0)

如果你真的反对来自二维数组或集合的任意排序,也许可以考虑创建一个反映你所做事情逻辑的内部类。你可以简单地定义一个包含两个数组的类,你可以让你的方法返回,使用名称和函数来反映你正在做的事情的逻辑。

答案 9 :(得分:0)

上述问题的一个简单解决方案是返回Map。这个问题的诀窍是如何定义键来识别对象,假设有两个 输入数组[a,a,a,a] [b,b,b,b]和两个输出数组[a,a,b,b] [b,b,a,a]

为此,您可以使用String变量作为键来识别对象,因为String变量是不可变的,因此它们可以用作键。 例如

   Map<String,String[]> method(String[] x,String[] y){

do your stuff..........

   Hashmap<String,String[]> map =new HashMap<String,String[]>();
map.put("Object2",[b,b,a,a]);

return map;
}