假设我有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对象,因为它将采用前面描述的所有方式,而是通过索引位置或以任何其他方式将其映射。 只是寻找一种很好的化学方法来解决它......
提前致谢
P.S。它应该只在几个类之间的1个包中使用,并且它的主要用途是基于prog1类型值的prog2类型值的总体
p.s.2 java7
答案 0 :(得分:3)
使用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取代:)
答案 1 :(得分:0)
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]
答案 2 :(得分:0)
番石榴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));
}
答案 3 :(得分:0)
- 单独使用Program1值
- 单独使用SubProgram1值
- 根据Program1值
填充SubProgram1值这里最简单的解决方案是声明所有dublicates的双维数组(因为它在完整的地图模式中显示)和1)和2)使用非重复的algorythm和3)从第2个循环周期填充数据尺寸
因此没有理由声明3个对象,巨大的内存保存和不错的方法。 我正在给自己一个明星:)