我有一个字符串列表和对象列表(SomeObject)。每个SomeObject都有一个其他对象列表(SecondaryObject),该对象将具有字符串属性。我需要检查字符串属性是否在第一个列表中。
List<String> stringList = new ArrayList<>(Arrays.asList("String1", "String2"));
List<SomeObject> objectList;
public class SomeObject {
public List<SecondaryObject> secondaryList;
}
public class SecondaryObject {
public String str;
}
for (String mainString : stringList) {
for (SomeObject obj : objectList) {
List<SecondaryObject> secobjList = obj.getSecList();
for (SecondaryObject secObj : secObjList) {
if (secObj.str.equals(mainString)) {
log.log("Found a match");
}
}
}
}
是否有任何最佳解决方案。
答案 0 :(得分:1)
我建议你使用哈希。制作stringList的hashMap,然后你不需要第三个循环。相反,对于每个secObj的字符串属性,只需尝试从map中获取它的值,如果它确实返回null,则找到匹配。
HashMap<String, Integer> map = new HashMap<String, Integer>();
for(String mainString: stringList){
map.put(mainString, 1);
}
for (SomeObject obj : objectList) {
List<SecondaryObject> secobjList = obj.getSecList();
for (SecondaryObject secObj : secObjList) {
if (map.get(secObj.str) != null) {
log.log("Found a match");
}
}
}
从O(n ^ 3)减少到O(n ^ 2)
答案 1 :(得分:0)
如果您不确定任何SecondaryObject内的字符串属性是否在SomeObject内的SecondaryObject列表中是唯一的,那么我建议首先将该字符串整理到Set中。 目标是转换这个找到两个字符串列表的交集的问题。
然后这个问题可以通过两种方式解决
遍历stringList并在另一个列表中搜索该字符串。如果您首先对该列表进行排序,则可以更快地进行搜索
这是对方法1的优化,您可以在这两个列表中使用最长的公共子序列算法(https://en.wikipedia.org/wiki/Longest_common_subsequence_problem)