有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

运行函数时发生java错误

大家好,我正在试着运行我的函数并测试它,我以为是junit测试,但我不明白为什么我的junit测试失败了。我确信我写的函数是有效的。如果有人想知道,这就是家庭作业

这是测试

@Test
public void test4() {
    lst1.removeAll(3);
    assertEquals(8, lst1.size());
    assertEquals(false, lst1.contains(3));
    lst1.removeAll(6);
    assertEquals(5, lst1.size());
    assertEquals(false, lst1.contains(6));
    lst1.removeAll(5);
    assertEquals(3, lst1.size());
    lst1.removeAll(4);
    assertEquals(2, lst1.size());
    lst1.removeAll(7);
    assertEquals(1, lst1.size());
    lst1.removeAll(8);
    assertEquals(0, lst1.size());
}

这是密码

public void removeAll( E x ) {
      first = first.next;
       if (first.data == x ) {
           first = first.next;   
       }
       Node curr = first;
       Node fut = curr.next ; 
       while ( fut!= null) {
            if (fut.data == x ) {
                curr.next = fut.next;               
            }
         curr=curr.next;
         fut=fut.next; 
       }
    assert check();
}

junit的设置

public class MyListTest {
    private MyList<Integer> lst0;
    private MyList<Integer> lst1;
    private Integer[] a;
    @Before
    public void setUp() throws Exception {
        lst0 = new MyList<Integer>();

        a = new Integer[] {3,4,3,5,6,8,6,6,7,5};
        lst1 = new MyList<Integer>();
        for(Integer x: a) {
            lst1.add(x);
        }
}

尺寸法

public int size() {
   return sz;
}

主要方法

public class MyList<E extends Comparable< E>> implements Iterable<E> {
   private Node first;
   private int sz;

   public MyList() {
      first = null;
      sz = 0;
      assert check();
   }
}

检查方法

private boolean check()
{
    if (first == null && sz != 0) return false;
    if (sz == 0 && first != null) return false;
    if (sz == 1 && (first == null || first.next != null)) return false;
    if (sz > 1 && (first == null || first.next == null)) return false;

    int count = 0;
    Node p = first;
    while(p != null) {
        count++;
        p = p.next;
    }

    if (count != sz) {
        System.out.printf("count = %d, sz = %d\n", count, sz);
        return false;
    }

    return true;
}

共 (1) 个答案

  1. # 1 楼答案

    如果你完全陷入困境,你可以考虑从头开始,然后再采取更小更安全的步骤。p>

    从一个简单的测试开始:

    @Test
    public void testConstruct() {
        MyNewList<Integer> myNewList = new MyNewList<Integer>();
        assertNotNull(myNewList);
        assertEquals(0, myNewList.size());
    }
    

    现在,在MyNewList中编写足够的代码,以通过测试-不要考虑复杂的结构,现在最简单的解决方案就足够了-即使return 0;对于size()也是可以的

    如果您的代码最终通过了测试,您可以编写另一个:

    @Test
    public void testAdd() {
        MyNewList<Integer> myNewList = new MyNewList<Integer>();
        myNewList.add(5);
        assertEquals(1, myNewList.size());
    }
    

    再次实现足够的代码,以通过两个测试。成功后,更改测试以检查您的解决方案是否也适用于其他参数:

    @Test
    public void testAdd() {
        MyNewList<Integer> myNewList = new MyNewList<Integer>();
        myNewList.add(5);
        assertEquals(1, myNewList.size());
        myNewList.add(7);
        assertEquals(2, myNewList.size());
    }
    

    现在你可以相信你的add()方法,并决定下一步要做什么:休息片刻,清理代码,组织类的内部结构,还是继续前进到旅程的下一个目的地

    当你最终继续时,你必须解决下一个难题:

    @Test
    public void testRemoveAll() {
        MyNewList<Integer> myNewList = new MyNewList<Integer>();
        myNewList.add(5);
        myNewList.add(5);
        myNewList.add(7);
        myNewList.add(3);
    
        assertEquals(4, myNewList.size());
        myNewList.removeAll(3);
        assertEquals(3, myNewList.size());
    }
    

    现在再次编写足够的代码以通过所有测试。目前,您甚至可以通过以下方式实现您的方法:

    public void removeAll(T element) {
        size ;
    }
    

    这是可能的,因为它完全满足上述测试描述的要求。现在,让我们面对你的方法进行更严格的检查,并改变测试:

    @Test
    public void testRemoveAll() {
        MyNewList<Integer> myNewList = new MyNewList<Integer>();
        myNewList.add(5);
        myNewList.add(5);
        myNewList.add(7);
        myNewList.add(3);
    
        assertEquals(4, myNewList.size());
        myNewList.removeAll(3);
        assertEquals(3, myNewList.size());
        myNewList.removeAll(5);
        assertEquals(1, myNewList.size());
    }
    

    如果你早些时候选择了一个微不足道的解决方案,你现在可能“遇到麻烦了”因此,请再次考虑removeAll()方法,并扩展其代码,直到再次通过测试。 完成这项工作后,您可以放心,您的代码是有效的

    如果你在课堂上改变了一些东西,再次运行测试,看看是否有东西坏了

    如果对方法的工作方式的需求发生了变化——请更改测试以反映新的需求,然后再次运行它们

    乍一看,这可能看起来很乏味,但一旦你建立了一个坚实的测试基础,你总是可以说:“我的代码确实能像它应该的那样工作。”