多个字符串数组比较

时间:2013-03-29 03:56:53

标签: php arrays data-structures

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

  

主要输入

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

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

2 个答案:

答案 0 :(得分:0)

我使用guava库multiset

答案 1 :(得分:0)

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

  1. 重命名这些变量。 mainSet,setA,setB等实际上是数组,而不是集合。称它们为candidateStrings,arrayA,arrayB等。
  2. 将arrayA,arrayB等重写为List中的项目,以便循环遍历它们。您将拥有一个名为List<String[]>的新名称。我不知道你的目的,所以我可以在拓扑中打开封面的想法之后调用此列表partitionscover。我们来使用分区。
  3. 将每个分区转换为Set<String>,以便您可以使用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的{​​{1}}。
  8. 编写一种方法来格式化counts
  9. 现在,这可能很慢。它会工作。您可以为每个步骤编写测试。一旦你编写了正确的代码,就要担心速度。