java - 如何在java中将字符串元素拆分为不相交的组?

Posted

技术标签:

【中文标题】java - 如何在java中将字符串元素拆分为不相交的组?【英文标题】:How can I split the string elements into disjoint groups in java? 【发布时间】:2017-03-29 23:31:58 【问题描述】:

行如下

A1;B1;C1
A2;B2;C2

如何找到一组唯一的字符串并按照以下标准将其分成不相交的组:如果两行在一个或多个列中有非空值重合,则它们属于同一组。比如线条

1,2,3
4,5,6
1,5,7

属于一个组。 最初我想通过三个 HashSet(对于每一列)来快速查看字符串是否包含在唯一值列表中,然后将其添加到已经分组的行列表或唯一行列表中。但是这种情况下的算法存在性能瓶颈:如果要合并组,则必须遍历列表中的每个组。对大量数据(> 100 万条记录)进行大量合并的算法运行缓慢。如果合并规模很小(大约数千),它会很快奏效。我被卡在了这个地方,不知道如何优化这个瓶颈或者是否需要使用其他数据结构和算法。谁能告诉我要挖哪个方向。如果您对此事有任何想法,我将不胜感激。

【问题讨论】:

您是否希望对行进行分组,如果两行共享一个共同的“项目”,它们就属于同一个组?你听说过“联合查找”数据结构吗? 【参考方案1】:

我建议采用以下方法:

创建一个Set<String> ungroupedLines,最初包含所有行。当您将它们分配给组时,您将删除它们。 按照您的建议构建三个Map<String, Collection<String>>-s,每列一个。 初始化一个空的Collection<Collection<String>> result。 虽然ungroupedLines 不为空: 创建一个新的Collection<String> group。 删除一个元素,将其添加到group。 使用您的三个地图从该元素执行“深度优先搜索”。 忽略(跳过)已从您的ungroupedLines 中删除的任何元素。 对于其余部分,将它们从 ungroupedLines 中删除,并将它们添加到 group,然后再递归它们。 或者,您可以使用广度优先搜索。 将group 添加到result

【讨论】:

以上是关于java - 如何在java中将字符串元素拆分为不相交的组?的主要内容,如果未能解决你的问题,请参考以下文章

如何在java中将方法标记为不鼓励?

在Java中将字符串拆分为等长的子字符串

在Java中将字符串拆分为字符串和int [重复]

如何在java中将Wav文件拆分为通道?

如何在 C++ 中将数字字符串拆分为数组? [复制]

如何在javascript中将集合的元素分组为不相交的子集?