создание карты с дубликатами ключей - PullRequest
2 голосов
/ 10 сентября 2011

Рассмотрим следующий вопрос о сохранении значений с дубликатами ключей:

  1. Предположим, есть класс Employee с именами, sal и dob в качестве атрибутов. Я хочу сохранить объекты Сотрудника на Карте, и ключом будет имя Сотрудника. Имя может быть повторено.

  2. Также после добавления 10 объектов на карту. Я хочу получить восьмой введенный объект.

Это является одним из решений для добавления объектов с дублирующимися ключами, но для 2-й части вопроса это не будет работать, так как при отображении карты, все значения с одинаковым ключом будут отображаться вместе.

Как мы будем поддерживать порядок, в котором объекты были добавлены в этой ситуации? Можем ли мы изменить методы equals и hashcode, чтобы каким-либо образом добавить элементы, а затем извлечь их в том порядке, в котором они были вставлены?

Ответы [ 4 ]

2 голосов
/ 10 сентября 2011

Я думаю, LinkedHashMultimap (из Гуава ) должно работать для этого. Вы не сможете получить восьмую запись по индексу напрямую, но вы можете использовать что-то вроде Iterables.get (Iterable iterable, int position) , чтобы получить ее.

1 голос
/ 10 сентября 2011

То, что вы намерены сделать, может быть легко реализовано с помощью ArrayList.Это структура данных, которую вы должны использовать.

1 голос
/ 10 сентября 2011

Почему бы просто не иметь два контейнера?Один для отображения имени сотруднику (например, в вопросе stackoverflow, который вы упомянули ), другой для отображения номера сотруднику.Вы можете создать «внешний» контейнер, объединяющий несколько карт и массивов.

0 голосов
/ 11 сентября 2011

Требования как-то противоречивы. С одной стороны должно быть возможно несколько значений для одного ключа, с другой стороны, для ключа должно быть возвращено только одно значение. Кроме того, поиск последовательности должен быть возможен. Я вижу ближайшее приближение при разработке выделенной структуры данных, содержащей хэш-карту для быстрого доступа на основе имени и список, сохраняющий порядок вставок. Доступ будет основан на общем порядковом номере или на имени плюс индекс для имени. Реализация будет в соответствии со следующими строками:

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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...