使用重复键创建地图

时间:2011-09-10 15:30:16

标签: java collections

考虑使用重复键存储值的以下问题:

  1. 假设有一个名为Employee的类,sal和dob作为属性。我想将Employee的对象存储在Map中,密钥将是Employee名称。名称可以重复。

  2. 在地图中添加10个对象后。我想检索输入的第8个对象。

  3. This是添加具有重复键的对象的一种解决方案,但对于问题的第二部分,这不起作用,因为在显示地图时,具有相同键的所有值将一起显示。

    在这种情况下,我们如何维护对象的添加顺序?我们可以修改equals和hashcode方法以某种方式添加元素,然后按照它们的插入顺序检索它们吗?

4 个答案:

答案 0 :(得分:2)

我认为LinkedHashMultimap(来自Guava)应该适用于此。您无法直接通过索引获取第8个条目,但您可以使用类似Iterables.get(Iterable iterable, int position)的内容来获取它。

答案 1 :(得分:1)

为什么不只有两个容器?一个用于将名称映射到员工(如stackoverflow question you mentioned中的那个),另一个用于将号码映射到员工。您可以将“外部”容器聚合为multimap和arraylist。

答案 2 :(得分:1)

您可以使用ArrayList轻松实现您打算执行的操作。这是您应该使用的数据结构。

答案 3 :(得分:0)

要求在某种程度上是矛盾的。在一侧,一个键应该可以有多个值,另一侧只能为一个键返回一个值。另外,应该可以检索序列。我在设计包含用于基于名称的快速访问的哈希映射的专用数据结构时看到了最近似的近似值,并且列出了保持插入顺序的列表。访问将基于整个序列号或名称加上名称的索引。实施将遵循以下几行:

public class Employee {
    public String name;  public int sal;        
    public Employee() {name = ""; sal = 0;}
    public Employee(String name, int sal) {
        this.name = name; this.sal = sal;
    }
    @Override public String toString() {return "(" + name + "," + sal + ")";}
}

public class Team {
    private Map<String, ArrayList<Employee>> employees = 
             new HashMap<String, ArrayList<Employee>>();
    private ArrayList<Employee> order = new ArrayList<Employee>();

    public void addEmployee(Employee e) {
        ArrayList<Employee> list = employees.get(e.name);     
        if (list == null) {
            list = new ArrayList<Employee>();
            employees.put(e.name, list); 
        } 
        list.add(e);
        order.add(e);
    }         
    public int getNumEmployees() {return order.size();}
    public Employee getEmployee(int n) {return order.get(n - 1);}       
    public int getNumEmployees(String name) {
        ArrayList<Employee> list = employees.get(name);
        return list == null ? 0 : list.size();
    }
    public Employee getEmployee(String name, int n) {
        ArrayList<Employee> list = employees.get(name);
        return list == null ? null : list.get(n - 1);
    }
}

// Test:
Team team = new Team();
team.addEmployee(new Employee("Bob", 11));
team.addEmployee(new Employee("Bob", 12));
team.addEmployee(new Employee("Eve", 13));
team.addEmployee(new Employee("Eve", 14));

System.out.println("Num all: " + team.getNumEmployees()); 
System.out.println("3rd: " + team.getEmployee(3));
System.out.println("Num Bobs: " + team.getNumEmployees("Bob")); 
System.out.println("2nd Bob: " + team.getEmployee("Bob", 2));