[英]looking for a smart and fast searching algorithm
假設我有2個對象數組,它們在以下方案中相互映射:
array1:
String [] prog_types1 = {"Program1","Program2","Program3","Program4"};
和array2:
String [] prog_types2 ={"SubProgram1","SubProgram2","SubProgram3","SubProgram4",
"SubProgram5","SubProgram6","SubProgram7","SubProgram8","SubProgram9","SubProgram10"};
正如它從名稱中所理解的那樣,prog_types2是prog_types1的擴展,但是有一些重復的值,所以這些程序之間的完整映射看起來像這樣:
prog_types1 prog_types2
ProgramType1 SubProgramType1
ProgramType1 SubProgramType2
ProgramType1 SubProgramType7
ProgramType1 SubProgramType9
ProgramType2 SubProgramType12
ProgramType2 SubProgramType7
ProgramType2 SubProgramType9
ProgramType3 SubProgramType1
ProgramType3 SubProgramType2
ProgramType3 SubProgramType21
ProgramType3 SubProgramType27
ProgramType3 SubProgramType7
ProgramType5 SubProgramType12
ProgramType5 SubProgramType9
我的問題是:從更快的處理和重用的角度來看,將這些數組相互映射的最佳方法是什么? 我已將其實現為:
- 一組類(類prog1和prog2以及將它放入向量后)...
- 帶有hashset的哈希表
- 可能還有一個陣列
我正在尋找的方式不應該包括為prog1對象再次創建相同的prog2對象,因為它將以前面描述的所有方式,但是例如以任何其他方式將其映射到索引位置。 只是尋找一種很好的化學方法來解決它......
提前致謝
ps它應該只在幾個類之間的1個包中使用,並且它的主要用途是基於prog1類型值的prog2類型值的總體
ps2 java7
使用Guava Libraries中的MultiMap ,您可以說:
Multimap<String, String> mmap = ArrayListMultimap.create();
mmap.put("Program1", "SubProgramType1");
mmap.put("Program1", "SubProgramType2");
// etc.
mmap.get("Program1")
看起來像:
[SubProgramType1, SubProgramType2, SubProgramType7, SubProgramType9]
BTW,Hashtable現在不用於哈希集合,已被HashMap取代:)
IMO最好的方法是:
Map<String, List<String>> programs = new HashMap<String, List<String>>();
將第一個列表中的字符串作為鍵和組成值列表的相應子程序。 現在映射很明顯:
ProgramType1 -> [SubProgramType1, SubProgramType2, SubProgramType7, SubProgramType9]
ProgramType2 -> [SubProgramType12, SubProgramType7, SubProgramType9]
ProgramType3 -> [SubProgramType1, SubProgramType2, SubProgramType21, SubProgramType27, SubProgramType7]
ProgramType5 -> [SubProgramType12, SubProgramType9]
Guava ListMultimap
,它給List<E>
,而不是Collection<E>
- 更加令人愉快。
private ListMultimap<String,Something> stuff = ArrayListMultimap.create();
// ...
public void add(String key, Something item) {
stuff.put(key, item);
}
public List<Something> get(String key) {
// might as well use the Lists convenience API while we're at it.
return Lists.newArrayList(stuff.get(key));
}
順便說一句,因為我需要:
- 單獨使用Program1值
- 單獨使用SubProgram1值
- 根據Program1值填充SubProgram1值
這里最簡單的解決方案是聲明所有dublicates的雙維數組(因為它在完整的地圖模式中顯示)和1)和2)使用非重復的algorythm和3)循環從第二維循環數據
所以沒有理由聲明3個對象,巨大的內存保存和很好的方法。 我給自己一個明星吧:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.