創建重複鍵地圖
回答
這些要求在某種程度上是矛盾的。在一側,一個鍵可以有多個值,另一側只能返回一個鍵的值。另外,一個序列的檢索應該是可能的。我在設計專用數據結構時看到了最接近的近似值,該數據結構包含基於名稱的快速訪問哈希映射和保持插入順序的列表。訪問將基於總體序列號或名稱加上名稱索引。實施將按照以下線路是:
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));
爲什麼不只是有兩個集裝箱?一個用於將名稱映射到員工(如stackoverflow question you mentioned中的名稱),另一個用於將員工映射到員工。你可以使一個「外部」容器聚合multimap和arraylist。
不是太多的內存使用?受訪者表示可以通過修改equals和hashcode方法來實現,但我不知道如何... –
@neeraj:好吧,它可以用hashcode完成,但我會說這將是一個醜陋的黑客攻擊。例如:在Empolyee中包含一個字段「hashcode」,初始化爲-1,在插入到散列表之前設置爲hashtable.size()。修改「Equals」,以便任何兩個員工如果不是同一個對象,就會有所不同。這應該做,但它很髒,並肯定會在代碼的其他部分出現一些問題。 – Vlad
我認爲LinkedHashMultimap(來自Guava)應該爲此工作。您無法直接通過索引獲得第8條,但您可以使用類似Iterables.get(Iterable iterable, int position)的內容來獲取它。
這不能用java集合實現嗎?受訪者曾說過改變equals和hashcode的方法,但我不知道如何實現它... –
@neeraj:好吧,LinkedHashMultimap基本上是一個LinkedHashMap
- 1. 春豆地圖重複鍵
- 2. 地圖中的重複鍵
- 3. 重新創建地圖
- 4. 創建表上的MySQL重複鍵?
- 5. 使用重複鍵創建對象
- 6. 使用重複鍵創建json數據
- 7. 創建唯一的索引 - 重複鍵
- 8. 跟蹤重複鍵STL地圖?
- 9. 帶有重複鍵的java地圖
- 10. 轉到地圖有重複的鍵
- 11. 創建複合鍵
- 12. Rails意外地創建重複記錄
- 13. Clojure地圖,鍵值創建順序
- 14. 重複點創建
- 15. 創建無重複
- 16. 從重複行的表創建視圖
- 17. 如何創建克隆重複視圖?
- 18. Matlab:在圖中創建重複的邊
- 19. 重複值 - 地圖
- 20. 創建複合外鍵
- 21. DataTable Vb.net創建複合鍵
- 22. 匹配地圖不重新創建
- 23. Automapper:重新使用創建的地圖
- 24. 地圖複合鍵排序
- 25. 地圖中的複合鍵
- 26. 在主鍵上創建複合外鍵
- 27. 創建地圖__stdcall
- 28. 創建地圖GUI
- 29. 重複使用Promise創建
- 30. Lucene創建重複索引
您是否有興趣在所有輸入/員工或僅與衝突的鍵/名稱的那些的插入順序? – Gevorg
2場景:1]假設我增加了10名全部具有相同密鑰和不同sal和dob的員工。 2] 10名僱員中的一些人有重複的鑰匙。在這兩種情況下,你將如何獲得地圖中的第n條記錄? –
可能的重複http://stackoverflow.com/questions/1062960/map-implementation-with-duplicate-keys –