我有2个列表。一个只有父对象,另一个可能有子对象。
由于这些列表可能很大,因此我需要一种方法,通过比较两个列表而不是O(n^2)
对象成为子对象的条件是它应该以其父对象名称为基础。例如:“ abcd”将是“ abc”的子对象。
List<String> childList=new ArrayList<>();
for(String parent: parentList){
for(String child: childList){
if(child.matches(parent + "(.*)"))
childList.add(child)
}
}
对于14k个对象,这大约需要10秒钟。有人可以帮我优化这个问题
答案 0 :(得分:1)
如果我很了解您的问题,那么您有2个字符串列表,A
和B
。目的是确定B
中的哪些字符串是A
中的字符串的前缀。
然后,存在一个名为trie的数据结构,它可以完成此操作。
首先,您需要将A
的每个字符串插入到特里。
然后,对于B
的每个字符串,您可以执行以下操作:通过读取当前字符串(或单词)遍历树。如果由于缺少节点而无法到达单词的末尾,则当前单词不是任何对象的“子代”。
另一方面,如果您完成当前单词并且仍在尝试中,则您单词是预先存储的单词的前缀。
您应该找到Java尝试的实现(或有关如何实现它们的想法)here。
答案 1 :(得分:1)
根据名称的长度,您可以在第一遍中创建子名称的所有前缀的映射。 (费用 O(n * nameLength)时间)
比起您可以在 O(1)(如果您使用 HashMap )中查找每个父级的子级,子级都有父级名称作为前缀。
您绝对应该避免使用 RegExp 进行匹配。这些都不便宜!
P.s。 如果仅用于检测前缀,您也可以在Google上搜索“前缀树”。