assertEquals (tree.contains (obj), hash.contains (obj)) возвращает false после переопределения hashCode () - PullRequest
0 голосов
/ 04 апреля 2019

В одной из моих школьных лабораторий я переопределил методы equals и hashCode.Я смог сделать метод equals очень хорошо, но у меня возникают некоторые проблемы с методом hashCode.

Мой код equals выглядит следующим образом, я думаю, что сделал это правильно, но я не на 100%уверен

@Override public boolean equals(Object other){
        if(this == other){
            return true;
        }
        if(other == null){
            return false;
        }
        if(!(other instanceof Polynomial)){
            return false;
        }
        Polynomial other2 = (Polynomial) other;
        if(this.getDegree() != other2.getDegree()){
            return false;
        }
        for(int i=0;i<this.getDegree();i++){
            if(this.getCoefficient(i)!=other2.getCoefficient(i)){
                return false;
            }
        }
        return true;
    }

Ниже приведен мой метод hashCode, я попал сюда с помощью автоматической генерации, которую eclipse предлагает для hashCode

@Override public int hashCode() {
        final int p = 31; //prime
        int res = 1;
        res = p * res + ((coefficients == null) ? 0 : coefficients.hashCode());
        res = p * res + this.getDegree();
        return res;
    }

Я думаю, что это должно быть хорошо, однако я бегув проблему с автоматическим тестером, предоставленным нам, чтобы проверить наши лаборатории.Проблема возникает со следующим фрагментом кода.BlueJ помечает assertEquals как неправильные, заявляя, что true ожидается, но результат был false.чтобы быть точным, это assertEquals (tree.contains (p1), hash.contains (p1)), который перехватывается BlueJ.

@Test public void massTest() {
        Random rng = new Random(SEED);
        TreeSet<Polynomial> tree = new TreeSet<Polynomial>();
        HashSet<Polynomial> hash = new HashSet<Polynomial>();
        CRC32 check = new CRC32();
        for(int i = 0; i < TRIALS; i++) {
            Polynomial p1 = createRandom(rng.nextInt(10), rng);
            Polynomial p2 = createRandom(rng.nextInt(10), rng);
            assertEquals(tree.contains(p1), hash.contains(p1));
            tree.add(p1);
            hash.add(p1);
            assertEquals(0, p1.compareTo(p1));
            assertEquals(0, p2.compareTo(p2));
            assertEquals(p1.compareTo(p2), -p2.compareTo(p1));
            check.update(p1.compareTo(p2));
        }
        assertEquals(tree.size(), hash.size());
        for(Polynomial p: tree) {
            assertTrue(hash.contains(p));
        }
        for(Polynomial p: hash) {
            assertTrue(tree.contains(p));
        }        
        assertEquals(28339163L, check.getValue());
    }
}

Мои проблемы сейчас заключаются в том, что я не могу понять, что этоэто именно то, что я делаю неправильно, и, честно говоря, я также не уверен, что assertEquals даже проверяет.Если бы кто-то мог направить меня в правильном направлении, я был бы очень признателен.

Точная ошибка, которая мне была дана,

java.lang.AssertionError: ожидается: верно, но было: ложно

в org.junit.Assert.fail (Assert.java:88)

в org.junit.Assert.failNotEquals (Assert.java:743)

в org.junit.Assert.assertEquals (Assert.java:118)

в org.junit.Assert.assertEquals (Assert.java:144)

в PolynomialTestThree.massTest (PolynomialTestThree.java:59)

...