我有一个已经填充的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>
答案 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;
}
}