Java 使用递归在列表中查找重复项?

Java 使用递归在列表中查找重复项?,java,list,recursion,Java,List,Recursion,我假设只使用递归(无循环)查找列表中是否有重复项并返回true或false。所以,如果使用char的ArrayList,[a,b,c,d,e]应该返回false。[a,a,b,c,d]或[a,b,b,c,c,d]应返回true。我尝试并测试了不同的方法,在某些情况下有效,但不是所有情况下都有效。我改变了我的代码,这就是我现在拥有的。(在最后一个if语句中出现问题) 谁能给我一些提示吗?谢谢 public static <T> boolean duplicate(List<

我假设只使用递归(无循环)查找列表中是否有重复项并返回true或false。所以,如果使用char的ArrayList,[a,b,c,d,e]应该返回false。[a,a,b,c,d]或[a,b,b,c,c,d]应返回true。我尝试并测试了不同的方法,在某些情况下有效,但不是所有情况下都有效。我改变了我的代码,这就是我现在拥有的。(在最后一个if语句中出现问题) 谁能给我一些提示吗?谢谢

    public static <T> boolean duplicate(List<T> list) throws NullPointerException {
        return duplicateHelper(list, list.get(0));
}

public static <T> boolean duplicateHelper(List<T> list, T t){
    if (list == null)
        throw new NullPointerException();
    if(list.isEmpty())
        return false;
    if(list.size() > 1){
        if(t.equals(list.get(1)))
            return true;        
    }
    if(list.size() == 1)
        return false;
    if(!duplicateHelper(list.subList(1,list.size()), t)){
        return  duplicate(list.subList(1,list.size()));
    }
    return false;

}
公共静态布尔复制(列表列表)引发NullPointerException{
返回duplicateHelper(list,list.get(0));
}
公共静态布尔重复帮助器(列表,T){
if(list==null)
抛出新的NullPointerException();
if(list.isEmpty())
返回false;
如果(list.size()>1){
如果(t.equals(list.get(1)))
返回true;
}
if(list.size()==1)
返回false;
if(!duplicateHelper(list.subList(1,list.size()),t)){
返回副本(list.subList(1,list.size());
}
返回false;
}

我建议您这样做:

function recurse(myList, seenList)  
{  
    currentElement =     myList.removeLastElement();
    if(seenList.contains(currentElement)    
     {
        return false;  
      }
    seenList.add(currentElement);   


    return recurse(myList,seenList);
}  

虽然我意识到这是一项家庭作业,但我试图尽可能直接地完成它,而不给出完整的解决方案。

我建议这样做:

function recurse(myList, seenList)  
{  
    currentElement =     myList.removeLastElement();
    if(seenList.contains(currentElement)    
     {
        return false;  
      }
    seenList.add(currentElement);   


    return recurse(myList,seenList);
}  

当我意识到这是一个家庭作业时,我试着在不给出完整解决方案的情况下尽可能直接地完成它。

递归由前置和后置条件辅助。在开始和结束时总是正确的事情。我看到的是,当您第一次输入
duplicateHelper
时,元素
t
位于传递列表的位置
0
。但是,当您递归到
duplicateHelper
时,传递的子列表不再包含索引
0
处的
t
,而是包含以前比较过的元素


考虑将子列表从
duplicate
传递到
duplicateHelper
,并将比较检查移动到非空的else。添加日志语句以找出代码哪里出错。

递归由前置和后置条件辅助。在开始和结束时总是正确的事情。我看到的是,当您第一次输入
duplicateHelper
时,元素
t
位于传递列表的位置
0
。但是,当您递归到
duplicateHelper
时,传递的子列表不再包含索引
0
处的
t
,而是包含以前比较过的元素



考虑将子列表从
duplicate
传递到
duplicateHelper
,并将比较检查移动到非空的else。添加日志语句以找出代码出错的地方。

问题是,如果要查找重复的代码,则需要两个元素—一个是从列表中传递的元素—因此需要以这种方式添加实现—当您在调试器中单步查看代码时,您会看到哪些错误?为什么它会求值(并返回结果)
duplicate(..)
duplicateHelper(..)
之后?初始/启动方法可能永远不会被再次调用。@pst
duplicateHelper
查找特定的元素
t
duplicate
查找列表中的下一个元素您可以浏览并选择问题的答案吗@TKP问题是,如果要查找重复项,则需要两个元素,一个是从列表中传递的元素,因此需要以这种方式添加实现。当您在调试器中单步执行代码时,您会发现出现了什么问题?为什么在
duplicate helper(…)
之后计算(并返回)
duplicate(…)
?初始/启动方法可能永远不会被再次调用。@pst
duplicateHelper
查找特定的元素
t
duplicate
查找列表中的下一个元素您可以浏览并选择问题的答案吗@TKP此解决方案的问题在于更改传入列表并创建一个新列表。这意味着您必须复制输入列表,才能创建一个可以安全修改的列表。如果内存不是问题,那太好了。@JohnB这是一个家庭作业问题,我将让OP了解迭代器对象的乐趣和/或学习递归逻辑的乐趣class@JohnB正如我之前所说,这显然是一个家庭作业问题,提供完整的工作计划既不是我的工作,也不是OP教授/助教以外的任何人的工作。在攻读第二个硕士学位的过程中,我尽可能多地利用我的教授,因为被填鸭式喂养是没有帮助的。但是,如果输入列表可以是链表,我建议删除第一个元素通常比删除最后一个元素更有效。此解决方案的问题是更改传入列表并创建一个新列表。这意味着您必须复制输入列表,才能创建一个可以安全修改的列表。如果内存不是问题,那太好了。@JohnB这是一个家庭作业问题,我将让OP了解迭代器对象的乐趣和/或学习递归逻辑的乐趣class@JohnB正如我之前所说,这显然是一个家庭作业问题,提供完整的工作计划既不是我的工作,也不是OP教授/助教以外的任何人的工作。在攻读第二个硕士学位的过程中,我尽可能多地利用我的教授,因为被填鸭式喂养是没有帮助的。但是,如果输入列表可以是链表,我建议删除第一个元素通常比删除最后一个元素更有效。日志记录不用于本地调试。调试器是。我已尝试将子列表传递给Helper,但问题是