2014-09-19 30 views
1

我有一个ListEmployee对象。从对象列表中检查元素的相等性

class Employee{ 
    private int empId; 
    private String name; 
} 

现在我有

List<Employee> empList = new ArrayList<Employee>(); 

我如何才能找到,如果我的列表中包含一个名为 “ABC” 的员工?
empList.contains("ABC");不会工作...

我应该把它放在Map ?? ??哪一个更有效?

只是想提一提,我从我的数据库Employee对象....

+0

怎么可能一个'Employee'永远等于一个'String'? – 2014-09-19 18:23:24

+0

你没有声明'empId'和'name'的类型。可能是你想'私人int empId;'和'私人字符串名称;' – afzalex 2014-09-19 18:28:16

+0

@afzalex - 谢谢...一个错字..其实我已经做了一个场景,只是模拟我的问题 – deejay 2014-09-19 18:43:07

回答

1

您可以使用

Map<String, Employee> map = new HashMap<>(); 
map.put("ABC", new Employee("ABC")); 
map.put("John", new Employee("John")); 

,然后检查

map.containsKey("ABC") 


我应该把它放在地图?哪一个更有效?

因为方法列表中,调用indexOf,这就需要遍历所有元素 这样

public int indexOf(Object o) { 
    if (o == null) { 
     for (int i = 0; i < size; i++) 
      if (elementData[i]==null) 
       return i; 
    } else { 
     for (int i = 0; i < size; i++) 
      if (o.equals(elementData[i])) 
       return i; 
    } 
    return -1; 
} 

凡为地图无需遍历所有元素

+0

不要超过等于检查包含...而是添加一个新的方法来检查它是否包含。当需要以不同的方式进行平等检查时,覆盖等于。什么等待你从哪里得到地图? – StackFlowed 2014-09-19 18:19:03

+0

我应该把它放在地图上吗?哪一个更有效?由OP – sol4me 2014-09-19 18:27:55

1

重写equals。然后,您可以使用List.contains

class Employee { 
    private empId; 
    private name; 
    public boolean equals(Object o) { 
     return (o instanceof Employee && ((Employee)o).empId == empId && ((Employee)o).name = name); 
    } 
} 


List l = ...; 
Employee e = new Employee(...); 
l.add(e); 
l.contains(e); 
+0

发布ControlAltDel,'l.contains(e)'将返回true,即使你没有覆盖'equals(...)'方法。 – afzalex 2014-09-19 19:13:39

+2

仅当Employee对象是同一个对象时。使用等于让你匹配的实际值 – ControlAltDel 2014-09-19 19:15:25

+0

我正在考虑你的例子。 – afzalex 2014-09-19 19:17:01

0

这里是你可以使用的代码。 我在考虑您希望列表中的empId和与Employee匹配时返回true。
我也更喜欢在代码中使用构造函数(只是建议)。
下面的代码将按照您的要求运行。

class Employee { 

    private int empId; 
    private String name; 

    // below overriden function will return true if it found Employee with 
    // same ID and name 
    @Override 
    public boolean equals(Object obj) { 
     return (obj instanceof Employee    //Checking instace of obj 
      && ((Employee)obj).empId == empId  //Checking empId 
      && ((Employee)obj).name.equals(name)); //Checking name 
    } 

    // Used constructor to create Employee 
    Employee(int id, String nm) { 
     empId = id; 
     name = nm; 
    } 

} 


下面是一个例子运行:

List l = new ArrayList(); 
l.add(new Employee(1, "ME"); 
System.out.println(l.contains(new Employee(1, "ME"))); //print true 

我还要感谢你,你也应该覆盖hashCode()当你决定要覆盖equals(...)根据设计模式方法。

1

既然你存储Employee对象,并在列表中没有String,我认为这是不可能没有通过所有列表循环搜索对象

for (Employee employee : empList) { 
     if (employee.getName().equals(searchString)) 
     System.out.println("Found"); 
    } 

注:您的Employee类应该给访问name字段无论是通过getter方法或将其更改为公共


还有其他的替代品,但它取决于速度之间您的要求和权衡的,空间,可读性,资源等

有一件事我能想到的是HashMap,其中有constant time lookup in average case

HashMap<Integer, String> hm = new HashMap<Integer, String>(); 
hm.put(1, "Tom"); 
System.out.println(hm.containsValue("Tom")); 

现在,

我应该把它放在地图?哪一个更有效?

而不是编码和分析,Know Thy Complexities事先!

+0

我曾尝试使用迭代器的相同方式...但我想,如果有更好的方法来做到这一点。仅供参考 - 我有getter setter ... – deejay 2014-09-19 19:40:04

1

在Java 8,如果你想确定雇员列表中是否包含一个名为“ABC”的员工,你可以这样做:

boolean containsABC = empList.stream().anyMatch(emp -> emp.getName().equals("ABC")); 
相关问题