【问题标题】:Multiple string array comparisons多个字符串数组比较
【发布时间】:2013-03-29 03:56:53
【问题描述】:

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

主要输入

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

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

【问题讨论】:

  • 太棒了!现在,你知道什么? Java 还是 PHP ?您知道什么语言以及到目前为止您尝试过什么,请与我们分享。
  • 我的 PHP 比 Java 好一点。但是,从性能的角度来看,我认为 Java 可以更好地解决此类问题?

标签: php arrays data-structures


【解决方案1】:

我会使用番石榴库multiset

【讨论】:

    【解决方案2】:

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

    1. 重命名这些变量。 mainSet、setA、setB 等实际上是数组,而不是集合。称它们为候选字符串、arrayA、arrayB 等。
    2. 将 arrayA、arrayB 等重写为 List 中的项目,以便您可以循环访问它们。您将拥有一个带有新名称的 List<String[]>。我不知道你的目的,所以在拓扑中打开覆盖的想法之后,我可能会将此列表称为partitionscover。让我们使用分区。
    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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-11
      • 1970-01-01
      相关资源
      最近更新 更多