Java Listnode实现计数出现次数方法的问题(递归)

Java Listnode实现计数出现次数方法的问题(递归),java,recursion,linked-list,implementation,Java,Recursion,Linked List,Implementation,大家好,我正在尝试实现ListNode,这两种方法都有问题 包含(E数据),它接受一个泛型对象并检查其是否存在于列表中 countIf(E数据)它接受一个通用对象并检查它在ListNode中的出现情况 我知道它可以用迭代方法实现,但我想练习递归,所以请告诉我我做错了什么: public class ListNode2<E> { public E data; public ListNode2<E> next; public ListNode

大家好,我正在尝试实现ListNode,这两种方法都有问题

  • 包含(E数据)
    ,它接受一个泛型对象并检查其是否存在于列表中

  • countIf(E数据)
    它接受一个通用对象并检查它在ListNode中的出现情况

我知道它可以用迭代方法实现,但我想练习递归,所以请告诉我我做错了什么:

public class ListNode2<E> {

    public E data;

    public ListNode2<E> next;

    public ListNode2(){
        this.data=null;
        this.next=null;
    }
    public ListNode2(E data, ListNode2<E> n) {
        this.data = data;
        next= n;
    }

    public ListNode2(E data) {
        this.data = data;
        next=null;
    }

    public E getData() {
        return this.data;
    }

    public ListNode2<E> getNext() {
        return this.next;
    }

    public ListNode2<E> addFirst(E data) {
        return new ListNode2<>(data, this);
    }
    public boolean contains(E data){

        if ( data ==null && this.getData()==null )
            return true;

        if (data!=null && (data.equals(this.getData())))
            return true;

        if (this.next==null)//remove the next and we have nullpointer exception but right results :( 
            return false;

        return this.getNext().contains(data);
    }    

    public int countIf(E data) {
        //i was missing the getNext() but now i get for the first element zero
        if(this.getNext()==null)
            return 0;

        if (data ==null && this.getData() == null )
            return 1+ getNext().countIf(data);

        if ( data!= null && (data.equals(this.getData())) )
            return 1 + getNext().countIf(data);



        return getNext().countIf(data);
    }

    public int size() {
        if (getNext() == null) {
            return 1;
        } else {
            return 1 + getNext().size();
        }
    }

    @Override
    public String toString() {
        return data + " ";
    }

    public static void main(String[] args) {

        ListNode2<Integer> list = null; // Leere Liste.
        list = new ListNode2<Integer>(1); // ergibt 1.
        list = list.addFirst(2);
        list = list.addFirst(3);
        list = list.addFirst(4);
        int size = list.size();

        System.out.println(size);

        System.out.println("countif 1 "+ list.countIf(1));//this gives 0 why??
        System.out.println("countif 2 "+ list.countIf(2));
        System.out.println("countif 3 "+ list.countIf(3));
        System.out.println("countif 5 "+ list.countIf(5));
        System.out.println("countif null "+ list.countIf(null));
        System.out.println("countif 7 "+ list.countIf(7));
    }
}
对于输出:

    Exception in thread "main" java.lang.NullPointerException
    at de.hsmannheim.inf.pr2.ads.ListNode2.countIf(ListNode2.java:74)
    at de.hsmannheim.inf.pr2.ads.ListNode2.countIf(ListNode2.java:83)
    at de.hsmannheim.inf.pr2.ads.ListNode2.countIf(ListNode2.java:83)
    at de.hsmannheim.inf.pr2.ads.ListNode2.countIf(ListNode2.java:83)
    at de.hsmannheim.inf.pr2.ads.ListNode2.main(ListNode2.java:126)
/home/pi/.cache/netbeans/11.0/executor-snippets/run.xml:111: The following error occurred while executing this line:
/home/pi/.cache/netbeans/11.0/executor-snippets/run.xml:68: Java returned: 1
BUILD FAILED (total time: 0 seconds)

这是关于你正在进行的检查的顺序

    public boolean contains(E data){

        if (this.next==null)//remove the next and we have nullpointer exception but right results :( add the 
            return false;

        if ( data ==null && this.getData()==null )
            return true;

        if (data!=null && (data.equals(this.getData())))
            return true;

        return this.getNext().contains(data);
    }    
现在,如果寻找的数据元素位于最后一个节点中,会发生什么?首先检查
next
是否为
null
。它是。因此返回
false
。您永远不会发现数据就在同一个节点中

相反,您需要将
null
检查放在内容的两个检查之后(当然,还是放在包含递归调用的
return
语句之前)

编辑:countIf()的情况类似,但更复杂。同样,您首先需要测试数据是否是搜索到的数据,如果是,则对其进行“计数”,获得0或1。然后测试
next
getNext()
是否为
null
。如果是,则返回获得的计数。最后,您需要将之前获得的计数添加到递归调用的结果中


顺便说一句,代码不错。

这是关于您正在执行的检查的顺序

    public boolean contains(E data){

        if (this.next==null)//remove the next and we have nullpointer exception but right results :( add the 
            return false;

        if ( data ==null && this.getData()==null )
            return true;

        if (data!=null && (data.equals(this.getData())))
            return true;

        return this.getNext().contains(data);
    }    
现在,如果寻找的数据元素位于最后一个节点中,会发生什么?首先检查
next
是否为
null
。它是。因此返回
false
。您永远不会发现数据就在同一个节点中

相反,您需要将
null
检查放在内容的两个检查之后(当然,还是放在包含递归调用的
return
语句之前)

编辑:countIf()的情况类似,但更复杂。同样,您首先需要测试数据是否是搜索到的数据,如果是,则对其进行“计数”,获得0或1。然后测试
next
getNext()
是否为
null
。如果是,则返回获得的计数。最后,您需要将之前获得的计数添加到递归调用的结果中


顺便说一下,代码不错。

您的
countIf
函数没有考虑第一个元素的值。 您可以通过以下方式进行更正:

public boolean contains(E data)
{
  if (Objects.equals(data, this.data)) return true;
  if (next==null) return false;
  return next.contains(data);
}
public int countIf(E数据)
{
布尔isDataEq=Objects.equals(数据,this.data);
if(getNext()==null)
{
返回isDataEq?1:0;
}
int-nextCount=getNext().countIf(数据);
返回isDataEq?1+nextCount:nextCount;
}
您可以通过以下方式简化
包含的
函数:

public boolean contains(E data)
{
  if (Objects.equals(data, this.data)) return true;
  if (next==null) return false;
  return next.contains(data);
}

countIf
函数不考虑第一个元素的值。 您可以通过以下方式进行更正:

public boolean contains(E data)
{
  if (Objects.equals(data, this.data)) return true;
  if (next==null) return false;
  return next.contains(data);
}
public int countIf(E数据)
{
布尔isDataEq=Objects.equals(数据,this.data);
if(getNext()==null)
{
返回isDataEq?1:0;
}
int-nextCount=getNext().countIf(数据);
返回isDataEq?1+nextCount:nextCount;
}
您可以通过以下方式简化
包含的
函数:

public boolean contains(E data)
{
  if (Objects.equals(data, this.data)) return true;
  if (next==null) return false;
  return next.contains(data);
}

我找出了
countIf()
方法中出现问题的原因,但第一个元素的值仍然为零,就好像它不在那里一样。我在这里追逐一个移动的目标,因为对您的问题进行了多次编辑。我不知道该回答哪一个版本,也不知道您是否会进一步编辑,使我的答案无效。我仍然相信我的答案在某一点上是切中要害的,同样是关于
countIf()
。如果您已经编辑了该方法,但仍然不理解为什么它会给出错误的结果,请提出一个新问题。您可以从这里链接到您的新问题,然后如果我有机会检查,我会的。先生,在countif()方法中,我刚刚更改了第一个if子句,它是this==null,我将它改为this.getNext()==null nothing。我甚至没有改变if子句的位置。我可以发布另一个问题,但我不喜欢在堆栈溢出中发送垃圾邮件,如果我问了两个相同主题的问题,这对像你这样愿意帮助的好人来说不是很好。但是如果有任何方式我可以从另一篇文章中标记你,那么我会删除这篇文章,然后再发布另一篇文章,然后如果没有人回答,我会标记你:)在你的
countIf
方法中,你仍然有一个与你从一开始在
contains
中的检查顺序相似的检查顺序。该订单给出了
contains
中的问题。它仍然会在
countIf
中给您带来问题。请相信你自己。你可以用一种类似于你在
contains()
中解决它的方法来解决它。我在
countIf()
方法中找出了问题的原因,但是第一个元素的值仍然为零,就好像它不在那里一样。我在这里追逐一个移动的目标,因为对你的问题进行了多次编辑。我不知道该回答哪一个版本,也不知道您是否会进一步编辑,使我的答案无效。我仍然相信我的答案在某一点上是切中要害的,同样是关于
countIf()
。如果您已经编辑了该方法,但仍然不理解为什么它会给出错误的结果,请提出一个新问题。您可以从这里链接到您的新问题,然后如果我有机会检查,我会的。先生,在countif()方法中,我刚刚更改了第一个if子句,它是this==null,我将它改为this.getNext()==null nothing。我甚至没有改变if子句的位置。我可以发布另一个问题,但我可以