删除" custom"从LinkedList重复

时间:2017-07-25 21:34:12

标签: java duplicates

我有一个已经填充的LinkedList集合,每个节点都包含一个ID,Name,Age。我想删除我的LinkedList中具有相同名称和年龄的任何节点,即使ID不同。 例如,如果我的列表有

111, Joe, 21
222, Bob, 20
333, Bob, 20 //duplicate, should be deleted
444, Bob, 40

我会删除第二个" Bob"因为它在我的程序中被认为是重复的,但是不会删除第3个" Bob"因为他有不同的年龄。 我做了一些谷歌搜索,人们会将LinkedList放入一个Set(因为它不能复制),然后把它放回到LinkedList中,但由于ID不同,它不适用于我的情况。 / p>

4 个答案:

答案 0 :(得分:1)

你仍然可以使用一个集合,你只需要覆盖你的类的hashCode和equals方法,只考虑名称和年龄字段。

public class Person{
    private int id;
    private String name;
    private int age;

    @Override
    public int hashCode(){
        int result = 17;
        result = 31 * result + name.hashCode();
        result = 31 * result + age;
        return result;
    }

    @Overrite
    public boolean equals(Object o) {

        if (o == this) return true;
        if (!(o instanceof Person)) {
            return false;
        }

        Person person = (Person) o;

        return person.name.equals(name) &&
                person.age == age ;
    }
}

答案 1 :(得分:0)

关键是你如何将两个元素识别为"相等"。为此,您需要覆盖equals中的Object方法。然后,一旦您的两个元素被认为是等于,您可以使用各种可能的方法来删除重复:迭代,使用Set实现(例如TreeSet),等等。

以下是您如何解决这个问题的最佳示例。

public class Record {
  private String id;
  private String name;
  private int age;

  // getters, setters, and constructor go here

  @Override
  public boolean equals(Object other) {
    if(other == null || ! other instanceof Record) {
      return false;
    } else if (this == other) {
      return true;
    } else {
      return this.name.equals(other.name) && this.age == other.age; // possible NPE if name is null, handle as appropriate
    }
  }
}

现在,如果你有两个相同的记录,你可以删除它们:

Record bob1 = new Record(222, "Bob", 20);
Record bob2 = new Record(333, "Bob", 20);
Record bob3 = new Record(444, "Bob", 40);

bob1.equals(bob2); //true -> remove one
bob1.equals(bob3); //false 
bob2.equals(bob3); //false 

请注意,如果您覆盖等于,则您也希望覆盖hashCode

您在示例中提供的数据存在的问题是,这两个20岁的人之间的唯一不同特征是#BB" records是id号。应删除哪一个,222或333?

答案 2 :(得分:0)

或者你可以这样做,按照名称排序你的名单,然后按年龄使用可比较的顺序排序,然后如果名字和年龄在i和i-1索引之间相同,你可以删除i Node。

public static class Node implements Comparable<Node>{
    int ID;
    String name;
    int age;

    //order by name
    public int compareTo( Node o ){
        if(name.equals(o.name)){
            return age - o.age;
        }
        return name.compareTo(o.name);
    }
}
 public static void main(String []args){

    LinkedList<Node> list = new LinkedList<Node>();
    //insert data...

    Collections.sort(list);
    int i = 1;
    while(i < list.size()){
        Node a = list.get(i-1);
        Node b = list.get(i);
        if( a.name.equals(b.name) && a.age == b.age ){
            list.remove(i);
        }else{
            i++;
        }
    }
 }

}

答案 3 :(得分:-1)

如果链接列表未排序,则假设您的链接列表没有修改结构,请使用以下代码:

void removeDuplicates() {
    Node ptr1 = null, ptr2 = null, dup = null;
    ptr1 = head;

    // Pick elements one by one 
    while (ptr1 != null && ptr1.next != null) {
        ptr2 = ptr1;

        // Compare the picked element with rest of the elements
        while (ptr2.next != null) {

         // If duplicate then delete it 
         if (ptr1.name.equals(ptr2.next.name) && ptr1.age == ptr2.next.age){

                // sequence of steps is important here
                dup = ptr2.next;
                ptr2.next = ptr2.next.next;
                System.gc();
            } else {
                ptr2 = ptr2.next;
            }
        }
        ptr1 = ptr1.next;
    }
}