如何知道自定义 Java 节点是不是包含在第二个节点中?

Posted

技术标签:

【中文标题】如何知道自定义 Java 节点是不是包含在第二个节点中?【英文标题】:How to know if a custom Java Node is included in a second Node?如何知道自定义 Java 节点是否包含在第二个节点中? 【发布时间】:2018-12-02 05:06:08 【问题描述】:

我再次需要 Java 方面的帮助... 我有这个简单的自定义节点类:

class Node
    private int elem;
    private Node next;

    public Node(int elem, Node next)
        this.elem = elem;
        this.next = next;
    

    public int getElem()
        return elem;
    

    public void setElem(int elem)
        this.elem = elem;
    

    public Node getNext()
        return next;
    

    public void setNext(Node next)
        this.next = next;
    

我需要实现一个静态布尔方法,该方法将两个节点作为参数,如果第一个节点的所有元素都包含在第二个节点中,则返回 true。 示例输出:

        1) Node p 5 Node q 5,5 returns true since element 5 of Node p is also in Node q
        2) Node p 1,3,5 Node q 0,1,2,3,4,5 returns true since 
        all elements of Node p are also in Node q
        3) Node p 5,3 Node q 3,4,6 returns false because 
        element 5 of Node p is not in Node q
        4) If first Node given as parameter to method is empty
        (with no values), the method will return true.

这是我的想法:

public static boolean included(Node p, Node q)
        //every element in p is in q?
        int count = 0;
        int temp = 0;
        int length = 0;
        while(p != null)
            temp = p.getElem();
            length++;
            while(q != null)
                if(q.getElem() == temp)
                    count++;
                q = q.getNext();
            
            p = p.getNext();
        
        return length == count || p == null;
    

对于Node p 的每个元素,我必须检查是否也在Node q 中。如果为真,我增加一个我称为count 的整数,否则我什么也不做。 对所有 p 元素完成此检查后,我会检查 count == size of Node pNode p is empty aka null

问题是:这个方法总是返回true。 我试图从返回值中删除 p == null 并且发生了一些变化,所以我怀疑这是问题所在,所以我向您展示了我是如何创建节点的:

        Node p = null;
        Node q = null;
        int arr1[] = 5,4,3,2,1,0;
        int arr2[] = 5,3,1;
        for(int i = 0; i < arr1.length; i++)
            p = new Node(arr1[i], p);
        for(int i = 0; i < arr2.length; i++)
            q = new Node(arr2[i], q);

有了这些节点,我应该得到true,但我只有在方法的返回值中包含指令p == null 时才能得到它。

你们将如何实现方法? 希望我已经清楚了。 非常感谢

【问题讨论】:

那是......实现List的一种奇怪方式。通常情况下,不会直接对Nodes 进行操作,而是在列表上执行一些public boolean containsAll(List that) 来实现此功能 【参考方案1】:

考虑一下你的这些代码行:

    while(p != null)
        ...
    
    return ... || p == null;

显然,这总是会返回 true,因为当循环退出时 p 总是为 null。

我建议你用两种方法实现逻辑。第一个检查节点或其后继节点是否包含元素。第二个检查具有第二个节点的所有元素。

boolean hasElement(int elem) 
    return this.elem == elem || (next != null && next.hasElement(elem));


boolean hasAllElements(Node node1, Node node2) 
    return node2.hasElement(node1.elem) && (next == null || hasAllElements(next, node2));

【讨论】:

以上是关于如何知道自定义 Java 节点是不是包含在第二个节点中?的主要内容,如果未能解决你的问题,请参考以下文章

我想在自定义列表视图中选择一项,该项目将显示在第二个活动的文本视图上

自定义交互过渡动画

ios - 如何知道第二个控制器是不是被解雇?

如何在第二个 VC 中使用第一个 VC 的方法?

如何在第一个对话框上调用removeView()以显示对话框编号2

ASP.Net 按钮不会触发,但会在第二个触发