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

Han*_*mpf 2 java

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

我想为数组实现一个交叉方法.

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

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

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

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

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

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

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

leo*_*loy 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 + ")";
    }

}
Run Code Online (Sandbox Code Playgroud)


DVK*_*DVK 6

阅读本文的最后一节:

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

报价:

这是在许多情况下使用传递引用的真正原因 - 它允许方法有效地具有许多返回值.Java不允许多个"实际"返回值,并且它不允许传递引用语义,这些语义将在其他单一返回值语言中使用.但是,这里有一些解决此问题的技巧:

  1. 如果您的任何返回值是指示方法成功或失败的状态代码,请立即消除它们.如果方法未成功完成,则将异常处理替换为抛出异常.例外是处理错误条件的更标准方法,可以更具表现力,并消除您的一个返回值.

  2. 查找相关的返回值组,并将它们封装到包含每条信息作为字段的对象中.可以扩展这些对象的类以便稍后封装它们的行为,以进一步改进代码的设计.您封装到对象中的每组相关返回值都会通过增加方法接口的抽象级别来从方法中删除返回值.例如,不是通过引用传递坐标X和Y以允许它们被返回,而是创建一个可变的Point类,按值传递对象引用,并在方法中更新对象的值.

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


Yis*_*hai 5

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

     public void foo(Object[] inOne, Object[] inTwo, Object[] outOne, Object[] outTwo) {
            //etc.
     }
Run Code Online (Sandbox Code Playgroud)

话虽如此,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; }
     }
Run Code Online (Sandbox Code Playgroud)

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