寻找智能和快速搜索算法

时间:2012-08-20 19:53:31

标签: java algorithm data-structures map java-7

假设我有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

4 个答案:

答案 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));
}

http://www.coffee-bytes.com/2011/12/22/guava-multimaps

答案 3 :(得分:0)

顺便说一句,因为我需要:

- 单独使用Program1值

- 单独使用SubProgram1值

- 根据Program1值

填充SubProgram1值

这里最简单的解决方案是声明所有dublicates的双维数组(因为它在完整的地图模式中显示)和1)和2)使用非重复的algorythm和3)从第2个循环周期填充数据尺寸

因此没有理由声明3个对象,巨大的内存保存和不错的方法。 我正在给自己一个明星:)