不使用HashSet - Java从链接列表中删除重复项

时间:2015-04-15 21:18:26

标签: java linked-list

如果两个学生相同,我试图从链表中删除学生,这意味着重复输入。这是使用JUnit测试用例进行测试的。但是,任何测试都返回相同的列表而没有删除学生。这是removeDuplicate方法,其中list是我的linkedList。

public void removeDuplicates() {

    for (int i = 0; i < list.size()-1; i++) {
        for (int j = i + 1; j < list.size(); j++) {
            if (list.get(i).equals(list.get(j))) {
                list.remove(j);
            }
        }
    }
}

其中一个失败测试用例的示例:

public void test_removeDuplicates_1() {
    ISimpleDatabase model = new SimpleDatabaseModel();
    Student s1 = new Student("John Doe", "G123456789", 3.5);
    Student s2 = new Student("Paul Graham", "G123456987", 2.75);
    Student s3 = new Student("Mary Joe", "G331456987", 3.25);
    Student s4 = new Student("Martin Fowler", "G654789321", 3.65);
    Student s5 = new Student("Paul Graham", "G123456987", 2.75);
    Student s6 = new Student("Mary Joe", "G331456987", 3.25);
    model.insert(s1);
    model.insert(s2);
    model.insert(s3);
    model.insert(s4);
    model.insert(s5);
    model.insert(s6);
    model.removeDuplicates();
    String expected = s1 + "\n" + s2 + "\n" + s3 + "\n" + s4;
    assertEquals(expected,model.toString().trim());

返回此错误:

test case failure

我确定错误在removeDuplicates()方法中,但我似乎无法弄明白。谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

如果你删除了一个项目,你需要先退一个j,然后测试新洗牌的项目,否则你会错过它。

if (list.get(i).equals(list.get(j))) {
    list.remove(j);
    j--;
}

答案 1 :(得分:-1)

我想出了一些有用的东西。我只是检查其中一个字段是否重复,因为如果学生ID相同,那么学生也是一样的。这似乎现在通过所有测试用例。只需要一些时间来解决它。谢谢大家。

public void removeDuplicates() {

    for (int i = 0; i < list.size() - 1; i++) {
        int count = i + 1;
        while (count < list.size()) {
            if (list.get(i).getGnumber().equals(list.get(count).getGnumber())) {
                list.remove(count);
            } else {
                count++;
            }
        }
    }
}