1

我有一个包含一些字符串的主数组。对于主数组的每个值,我想检查子数组中出现了哪些字符串以及出现了多少次。例如,我有以下数组:

主要输入

mainArray = {A, B, C, P}

Subarrays
arrayA = {a,c,d,m,o}
arrayB = {b,c,p,q,r}
arrayC = {a,p,q,r,t,e,o}
……………………………
……………………………
arrayN = {a,c,p,n,o}

现在我想检查 A、B、C 和 P 一起出现的位置以及出现了多少次。它应该生成以下输出:

resultArray = {{a,b,0}{a,c,2}{a,p,1}{b,c,0}{b,p,0}{c,p,2}}

最后一步是,主数组的每个字符串出现在子数组中的次数:

最终输出

lastArray = A=3,B=0,C=4,P=3

我将拥有数千个主阵列和数千个子阵列。因此,性能也是一个问题:(

4

2 回答 2

0

我会使用番石榴库多集

于 2013-03-29T04:05:13.070 回答
0

让我们继续使用标准 Java。将问题分解为步骤。

  1. 重命名这些变量。mainSet、setA、setB 等实际上是数组,而不是集合。称它们为候选字符串、arrayA、arrayB 等。
  2. 将 arrayA、arrayB 等重写为 List 中的项目,以便您可以循环访问它们。你会有一个List<String[]>, 有一个新的名字。我不知道你的目的,所以我可能会调用这个列表,partitions或者cover,在拓扑中打开覆盖的想法之后。让我们使用分区。
  3. 将每个分区转换为Set<String>s,以便您可以使用 Java Collections 框架。你最终会得到一个List<Set<String>>.
  4. 计算 mainSet 的所有 2 元素子集的集合。顺便说一句,这就是为什么 CandidateStrings 作为List. 使用Set<Set<String>>并调用它pairs
  5. 对于 mainList 的每个 2 元素子集,使用Set.containsAll计算包含它的分区数。将计数存储在一个Map<Set<String>, Integer>名为pairCounts.
  6. resultSet在这里没有多大意义;什么数据结构{a, b, 0}?只需编写一个格式化pairCounts供人类消费的方法。
  7. 迭代两者candidateStringspartitions计算你的lastSet,这真的应该是一个Map<String, Integer>被调用的counts
  8. 编写一个格式化的方法counts

现在,这可能很慢。它会起作用的。您可以为每个步骤编写测试。一旦编写了正确的代码,就担心速度。

于 2013-03-29T19:52:18.683 回答