从对象列表中查找字符串

时间:2015-10-25 04:04:56

标签: java list arraylist

我有一个字符串列表和对象列表(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");
              }
          }
     }
}

是否有任何最佳解决方案。

2 个答案:

答案 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中。 目标是转换这个找到两个字符串列表的交集的问题。

然后这个问题可以通过两种方式解决

  1. 遍历stringList并在另一个列表中搜索该字符串。如果您首先对该列表进行排序,则可以更快地进行搜索

  2. 这是对方法1的优化,您可以在这两个列表中使用最长的公共子序列算法(https://en.wikipedia.org/wiki/Longest_common_subsequence_problem