JUnit的LinkedList方法测试失败,为什么?

UserFuser

我有此方法,它将搜索LinkedList(名为ListNode)并检查chars,并检查它们是否包含大写chars,然后将其存储在新的链表中,并返回它。我为此编写了代码,并用JUnit对其进行了测试,但它未能通过JUNit(这些蓝框中的其中一个)。有人知道出了什么问题吗?

这是我的LinkedList方法:

public static ListNode copyUpperCase(ListNode head) {
    ListNode newListNode = mkEmpty();
    if(head == null){
        throw new ListsException("");
    }else{      
        while(head.next != null){
            if(Character.isUpperCase(head.element)){
                newListNode.element = head.element;         
            }
            head = head.next;
        }
    }
    return newListNode;
}

这是ListNode:

public class ListNode {
    public char element;
    public ListNode next;
}

这是测试方法:

@Test
public void testCopyUpperCase()
{
    // Inject upper case letters randomly in the test strings.
    // Assert equal results when extracting the upper case chars from
    // the corresponding list, as wheen extracting them from the 
    // injected string itself.
    for ( String s : cases ) {
        String uppersAndLowers = randInjectUpper(s);
        // Extract the upper case characters
        StringBuilder uppers = new StringBuilder();
        for ( int i = 0; i < uppersAndLowers.length(); i++ ) {
            final char c = uppersAndLowers.charAt(i);
            if ( Character.isUpperCase(c) )
                uppers.append(c);
        }
        ListNode temp = Lists.toList(uppersAndLowers);
        ListNode lhs = Lists.copyUpperCase(temp);
        assertFalse(hasSharedNodes(temp,lhs));
        ListNode rhs = Lists.toList(uppers.toString());
        assertTrue(Lists.equals(lhs,rhs));
    }
}

测试方法中的失败行是最后一行,这是:

assertTrue(Lists.equals(lhs,rhs));

如果在那条线上失败,那是什么意思?

ps。这也是equals方法:

// Two lists are equal if both are empty, or if they have equal lengths
// and contain pairwise equal elements at the same positions.
public static boolean equals(ListNode l1,ListNode l2) {
    if ( isEmpty(l1) && isEmpty(l2) )
        return true;
    else if ( isEmpty(l1) || isEmpty(l2) )
        return false;
    else { // both lists are non-empty
        ListNode p1 = l1.next, p2 = l2.next;
        while ( p1 != null && p2 != null ) {
            char c1 = p1.element, c2 = p2.element;
            if ( p1.element != p2.element )
                return false;
            p1 = p1.next;
            p2 = p2.next;
        }
        return p1 == null && p2 == null;
    }
}

编辑:这是新方法:

public static ListNode copyUpperCase(ListNode head) {

    ListNode newListNode = mkEmpty();
    if(head == null){
        throw new ListsException("Lists: null passed to copyUpperCase");
    }else{
        String cpy = toString(head);
        char[] chry = cpy.toCharArray();
        for(int i = 0; i < chry.length ; i++ )
                if(Character.isUpperCase(chry[i])){
                    newListNode.element = chry[i];      
                }
                newListNode = newListNode.next;
        }           
    return newListNode;
}
灵魂大师

您的equals方法似乎还可以。它正确地检查两个列表是否都为空,然后正确地检查一个列表是否为空而另一个列表是否为空。之后,您同时遍历两个列表,检查每个字符,最后,期望两个指针都为空。一切都没问题。

因此,问题必须出在toList方法中或copyUppercase方法中。确实,您的copyUppercase方法是越野车。问问自己,只有一个元素的列表会发生什么?然后问问自己,所提供的列表的最后一个元素将如何处理?你能看到景点吗?

while循环条件是错误的:它必须简单地是

while (head != null) { ... }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章