删除LinkedList中的相关字段

时间:2014-11-01 20:52:38

标签: java linked-list

所以我有2个txt文件,都有ip:port的列表

我正在将列表加载到他们自己的链接列表中

    public static LinkedList<DataValue> result = new LinkedList<DataValue>();
    public static LinkedList<DataValue> badresult = new LinkedList<DataValue>();

他们有一个类值

public static class DataValue {
    protected final String first;
    protected final int second;

    public DataValue(String first, int second) {
        this.first = first;
        this.second = second;
    }
}

尝试做到这一点...... 将list1加载到结果中 将list2加载到badresult

然后从结果中删除所有badresult

所以加载完成

public static void loadList() throws IOException {
    BufferedReader br = new BufferedReader(new FileReader("./proxy.txt"));
        String line;
        String args[];
        String first;int second;
        while ((line = br.readLine()) != null) {
           args = line.split(":");
           first = args[0];
           second = Integer.parseInt(args[1]);
           result.add(new DataValue(first, second));
        }
}
public static void loadUsed() throws IOException {
    BufferedReader br = new BufferedReader(new FileReader("./usedproxy.txt"));
        String line;
        String args[];
        String first;int second;
        while ((line = br.readLine()) != null) {
           args = line.split(":");
           first = args[0];
           second = Integer.parseInt(args[1]);
           badresult.add(new DataValue(first, second));
        }
}

这是我尝试从结果链表

中删除所有相同结果的失败尝试
public static void runCleaner() {
    for (DataValue badresultz : badresult) {
        if (result.remove(badresultz)) {
            System.out.println("removed!");
        } else {
            System.out.println("not removed...");
        }
    }
}

1 个答案:

答案 0 :(得分:1)

在Java中,我们使用equals方法来检查对象是否相等。您的DataValue类没有实现这一点,因此当您要求从列表中删除对象时,它实际上是使用==(由Object类实现)来比较对象。

System.out.println((new DataValue("hello", 1)).equals(new DataValue("hello", 1))); 
// prints false

这是因为2个对象实际上由内存中的2个不同空格表示。要解决此问题,您需要覆盖equals类中的DataValue方法,同样优先覆盖hashCode方法也是如此。我使用eclipse为我生成了两种方法:

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((first == null) ? 0 : first.hashCode());
    result = prime * result + second;
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    DataValue other = (DataValue) obj;
    if (first == null) {
        if (other.first != null)
            return false;
    } else if (!first.equals(other.first))
        return false;
    if (second != other.second)
        return false;
    return true;
}