1

假设我有 2 个对象数组,它们在以下模式中相互映射:

数组1:

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 并在将其放入向量之后)...

-- 带有哈希集的哈希表

-- 可能还有一个数组

我正在寻找的方式不应该包括为 prog1 对象再次创建相同的 prog2 对象,就像前面描述的所有方式一样,而是通过例如索引位置或以任何其他方式映射它。只是寻找一种很好的算法方法来解决它......

提前致谢

ps 它应该只在几个类之间的 1 个包中使用,它的主要用途是基于 prog1 类型值的 prog2 类型值的填充

ps2 java7

4

4 回答 4

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]

顺便说一句,Hashtable 现在不用于散列集合,已被HashMap取代:)

于 2012-08-20T20:10:18.487 回答
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]
于 2012-08-20T19:56:54.370 回答
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

于 2012-08-20T20:18:28.070 回答
0

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

-- 单独使用 Program1 值

-- 单独使用 SubProgram1 值

-- 根据 Program1 值填充 SubProgram1 值

这里最简单的解决方案是声明一个包含所有重复项的二维数组(因为它在完整地图模式中不正常显示)和 1)和 2)使用非重复算法和 3)从二维循环循环

所以没有理由声明 3 个对象,巨大的内存节省和不错的方法。我给自己一颗星:)

于 2012-08-21T15:00:30.187 回答