好的,这就是我想要做的事情:
我想为数组实现交叉方法。
它应该采用2个相同大小的数组并返回两个新数组,它们是两种输入数组的混合。 如[a,a,a,a] [b,b,b,b] ------> [a,a,b,b] [b,b,a,a]。
现在我想知道在Java中建议的方法是什么,因为我不能返回多个值。
我的想法是: - 返回包含两个新数组的Collection(或数组)。
我真的不喜欢那个,因为它认为会导致更难理解代码。 - 通过为每个案例调用方法,但每次仅获取一个结果,无需返回两个结果。
我也不喜欢那个,因为没有关于应该返回哪个解决方案的自然顺序。这需要指定,但导致更难理解代码。
另外,这只适用于这种基本情况,但我希望在交叉之前对数组进行洗牌,然后再将其反转。因为我不想实际操作,所以我无法进行与交叉隔离的混洗,相反,我想在进行交叉时使用有关置换的信息,这将是一种更有效的方式。
我的问题不是关于算法本身,而是关于在Java中输入方法(关于输入和输出)的方法
答案 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不允许 多个“真实”的返回值,以及它 不允许通过引用传递 将在其他中使用的语义 单一返回值语言。 但是,这里有一些技巧 解决这个问题:
如果您的任何返回值是表示成功或的状态代码 方法失败,消除它们 立即。替换它们 异常处理抛出一个 例如,如果方法没有 顺利完成。例外 是一种更标准的处理方式 错误的条件,可以更多 表达,并消除你的一个 返回值。
- 醇>
查找相关的返回值组,并将其封装到 包含每一块的对象 信息作为字段。的课程 这些对象可以扩展为 稍后将其行为封装到 进一步完善了设计 码。每套相关的回报 您封装到的值 object从中删除返回值 方法通过提高水平 抽象方法的界面。 例如,而不是通过 通过参考协调X和Y. 允许他们返回,创建一个 可变Point类,传递一个对象 按值引用,并更新 方法中对象的值。
作为奖励,此部分由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数组传递了引用,因此对数组所做的任何修改都将对数组本身进行。这有几个警告
您可以使用以下格式:
// 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;
}