我有一个字符串列表,我需要找到所有重复的,也删除所有的孩子,如果父母在列表中。我的字符串可以有一个最大4级:第0级:"根",或留空第1级:"瑞典"、"美国"等......二级:"瑞典.斯德哥尔摩"、"美国.芝加哥"等......三级:"瑞典.斯德哥尔摩. solr 纳""美国.芝加哥.西塞罗"等等......
所以如果我有一个列表["Sweden", "Sweden", "Sweden.Stockholm.Solna", "America.Chicago", "America.Chicago", "America.Chicago.Cicero"]
,那么只应该返回["Sweden", "America.Chicago"]
。
如何使用Java,最好是java 8流API来实现这一点?
以下两种方法可用于检查一个字符串是另一个字符串的父级还是子级:
private boolean isChildOf(String parentPath, String path) {
return path.startsWith(parentPath.isBlank() ? parentPath : parentPath + ".") && !path.equals(parentPath);
}
private boolean isParentOf(String childPath, String path) {
return childPath.startsWith(path + ".") && !path.equals(childPath);
}
4条答案
按热度按时间axkjgtzd1#
下面是我的实现,我已经测试过了,并且工作正常。
下面是我使用的自定义方法
编辑:由于OP已经接受了答案,我将离开之前的实现。然而,正如在评论中指出的,这个解决方案错过了一些父元素共享相同根级别的情况。我已经修改了我的实现以适应这种情况。对于
List<String> nodes
或Map<String, List<String>> groups
没有必要进行任何更改,所以我将只发布修改后的List<String> parents
和新的helper方法。数值水平法
新的实现使用
distinct
来删除重复项,然后为groups
Map中的每个列表条目确定最小级别数(使用.
的出现次数),并返回符合条件的元素的过滤列表,最后将结果扁平化为单个列表。juzqafwq2#
如果isChildOf方法是正确的,那么使用嵌套循环对照列表中的每个其他元素(当前元素除外)检查每个元素就可以解决这个问题。
首先删除重复项
然后删除子项
dwbf0jvd3#
创建新列表以获取所有重复项
创建另一个列表以获取所有查尔兹
从重复项中删除所有查尔兹项
Final
duplicates
是您想要的最终结果。dwbf0jvd4#
这里有一种使用集合的方法,它适用于层次结构的任何深度。
印刷品