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中将字符串元素拆分为不相交的组?的主要内容,如果未能解决你的问题,请参考以下文章