【问题标题】:deleting a unique record from List从 List 中删除唯一记录
【发布时间】:2010-08-13 10:35:18
【问题描述】:

我有一个员工列表。我的员工类别如下

public class Employee{
  int empid;
  String name;
  ...
}

现在我想从列表中删除 empid 为 5 的员工。一种方法是迭代列表并检查 empid == 5。还有其他方法可以做到吗?

还希望我的列表包含具有唯一 empid 的员工。任何尝试添加具有重复 empid 的员工都应引发异常。如何执行此操作?

【问题讨论】:

  • 只需通过 list.remove(object) 删除您的员工,其中 object 是您要删除的员工。还是您只有员工的身份证?

标签: java list unique


【解决方案1】:

使用Set< Employee> 代替List< Employee>。 不要忘记覆盖 Employee 类的 hashCode()equals() 方法。

【讨论】:

  • 需要注意的是,这个建议的前提是OP不需要多次存储一个员工,员工的顺序无关紧要。
  • 但我也想稍后对列表进行排序
  • 那么您要么需要使用实现 SortedSet 的类(例如 TreeSet),要么坚持使用 List 并选择其他答案中提供的其他选项之一。
【解决方案2】:

如果员工的顺序是相关的(或者如果您需要能够让一名员工被多次代表),您需要将它们存储在一个列表中。 (否则一个 Set 就足够了。)

我会让Employee 覆盖equals 方法并使用List.remove(Object o)

来自 List 的 API 文档:

boolean remove(Object o)
如果指定元素存在,则从该列表中删除第一次出现的指定元素(可选操作)。如果此列表不包含该元素,则它不变。更正式地说,删除具有最低索引 i 的元素,使得 (o==null ? get(i)==null : o.equals(get(i))) (如果存在这样的元素)。

具体来说,你可以做类似的事情

public class Employee{

    int empid;
    String name;

    public boolean equals(Object o) {
        if (o == null || !(o instanceof Employee))
            return false;
        Employee e = (Employee) o;
        return empid == e.empid && name.equals(e.name);
    }

    public int hashCode() {
        return empid ^ name.hashCode();
    }
}

【讨论】:

  • @aioobe,我会检查 null 以及 equals(...) 并可能在 equals(...)hashCode() 之前添加 @Override 注释。
  • 是否也需要覆盖哈希码?还是只有覆盖 equals 才行?
  • @akshay,没有必要,但强烈推荐。见:stackoverflow.com/questions/27581/…
  • @Bart K,你提出了很好的观点。每当您在我的任何帖子中发现改进空间时,请不要犹豫进行编辑。 :) 我想补充一点,我真的很喜欢简约而简洁的示例,这些示例具有尽可能少的代码行“离题”...
  • @aioobe,好吧,会那样做! :) 是的,@Override 可以在此处的示例中省略,但null 的检查应该在那里,因为某些集合可以包含null。所以我把它加进去了。
【解决方案3】:

对于您的问题的第一部分,您可以调用 remove() 传入一个 Employee 对象,该对象的 equals() 方法为 id 为 5 的 Employee 返回 true。

对于您的第二部分,Set 保证没有任何重复,而不是 List。您的收藏有必要成为一个列表吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-05
    相关资源
    最近更新 更多