我编写了一个方法,基本上检查两个ArrayLists中的所有元素是否相等,如果是,则返回true。我相信这种方法有效,但是,我还想在不使用任何循环的情况下仅使用递归来编写相同的方法,这意味着我必须替换for循环块。有什么建议或提示吗?
public static boolean isEqual(ArrayList<O> arrlist1, ArrayList<O> arrlist2) {
ArrayList<O> um=new ArrayList<O>();
ArrayList<O> um2=new ArrayList<O>();
um=arrlist1;
um2=arrlist2;
boolean comp=false;
if (um.size()==um2.size()){
for (int i=0; i<um.size(); i++){
if (um.get(i)==(um2.get(i)))
comp=true;
else
comp=false;
}
}
return comp;
}
答案 0 :(得分:1)
Java提供了一种方法,我建议你使用它(equals(Object)
)。此外,您的方法签名应该更像这样(请注意布尔值之前的<T>
。)
public static <T> boolean isEqual(List<T> arrlist1, List<T> arrlist2) {
if (arrlist1.size() == arrlist2.size()) {
return arrlist1.equals(arrlist2);
}
return false;
}
来自Javadoc,
将指定对象与此列表进行比较以获得相等性。当且仅当指定的对象也是列表时,返回
true
,两个列表具有相同的大小,并且两个列表中所有对应的元素对都相等。
要以递归方式执行此操作,您可以将List#subList(int,int)
与
public static <T> boolean isEqual(List<T> arrlist1, List<T> arrlist2) {
if (arrlist1.size() == arrlist2.size()) {
if (arrlist1.get(0).equals(arrlist2.get(0))) {
if (arrlist1.size() == 1) {
return true;
}
return isEqual(arrlist1.subList(1, arrlist1.size()),
arrlist2.subList(1, arrlist2.size()));
}
}
return false;
}
答案 1 :(得分:1)
递归版:
public static boolean isEqual(ArrayList<O> arrlist1, ArrayList<O> arrlist2, int n) {
if (arrlist1.size() == n && arrlist1.size() == arrlist2.size()) {
return true;
} else {
if (arrlist1.get(n).equals(arrlist2.get(n))) {
return isEqual(arrlist1, arrlist2, n + 1);
}
else {
return false;
}
}
}
应该像这样调用:
isEqual(arrlist1, arrlist2, 0);
答案 2 :(得分:0)
我假设您希望以学习为目的递归执行此操作(由于任何其他原因而无需执行此操作;最好使用现有的库例程,并且最好使用for
像你已经做过的那样循环。)
使用递归的一般方法是,您将通过在问题中找到同一问题的一个或多个较小版本来解决您的问题。因此,为了比较数组的相等性,如果数组的长度为N,则可以通过
编写递归方法比较第一个元素,然后(较小的问题)递归地比较两个数组的第二个到最后一个元素,这两个数组将是长度为N-1的数组;或
比较最后的元素,然后(较小的问题)递归地比较作为每个数组的第一个N-1个元素的子阵列;或
如果你真的想要好的做法,把每个数组分成两半(两个较小的问题),然后比较左半部分是否相等,右半部分是否相等。
要获得较小的数组,您可能不希望通过复制元素来创建新数组 - 太慢。相反,您可以编写一个方法,只将子数组的第一个和最后一个索引作为参数,然后您的递归方法将假定这些边界之间的较大数组的部分是它正在处理的较小的子数组。 (或者如果第一个索引每次都相同,或者每次最后一个索引都相同,那么你只需要传递一个参数;这就是@alfasin的解决方案所做的。它假设它使用的子数组具有边界{{ 1}}和n
。)
您还需要确定何时停止。对于前两种方法,您可以在子数组的长度为0时停止。(或者当子数组的长度为1时,您可以比较单个元素而不是递归调用该方法。您的选择。)对于第三种方法,当您划分时在一半的子阵列中,你必须使用长度为1的子阵列停止 - 否则,如果你试图将它分成两半,你将有一个长度为0且长度为1的数组 - 而最后一个不是< em>较小的问题!!
无论如何,这是一个非常冗长的答案,当然比你需要比较两个数组的平等要多得多。但是我试图给你一个基本的想法,告诉你如何处理你真正做需要递归的其他问题。