Java 从对象列表中查找字符串

Java 从对象列表中查找字符串,java,list,arraylist,Java,List,Arraylist,我有一个字符串列表和对象列表(SomeObject)。每个SomeObject都将有一个其他对象(SecondaryObject)的列表,并且该对象将有一个string属性。我需要检查字符串属性是否在第一个列表中 List<String> stringList = new ArrayList<>(Arrays.asList("String1", "String2")); List<SomeObject> objectList; public class S

我有一个字符串列表和对象列表(SomeObject)。每个SomeObject都将有一个其他对象(SecondaryObject)的列表,并且该对象将有一个string属性。我需要检查字符串属性是否在第一个列表中

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");
              }
          }
     }
}
List-stringList=newarraylist(Arrays.asList(“String1”、“String2”);
列表对象列表;
公共类对象{
公开名单第二名单;
}
公共类第二对象{
公共字符串str;
}
用于(字符串:字符串列表){
对于(SomeObject对象:对象列表){
List secobjList=obj.getSecList();
for(第二对象secObj:secObjList){
if(secObj.str.equals(mainString)){
log.log(“找到匹配项”);
}
}
}
}

有没有比这更好的解决方案。

如果您不确定任何SecondaryObject中的string属性在SomeObject中的SecondaryObject列表中是否是唯一的,那么我建议首先将该字符串整理成一个集合。 我们的目标是改变这个问题,找到两个字符串列表的交集

那么这个问题可以用两种方法来解决

  • 遍历stringList并在另一个列表中搜索该字符串。如果先对列表排序,搜索速度会更快

  • 这是对方法1的优化,在方法1中,您可以同时使用两个列表,然后使用最长的公共子序列算法()


  • 如果您不确定任何SecondaryObject中的string属性在SomeObject中的SecondaryObject列表中是否是唯一的,那么我建议首先将该字符串整理到一个集合中。 我们的目标是改变这个问题,找到两个字符串列表的交集

    那么这个问题可以用两种方法来解决

  • 遍历stringList并在另一个列表中搜索该字符串。如果先对列表排序,搜索速度会更快

  • 这是对方法1的优化,在方法1中,您可以同时使用两个列表,然后使用最长的公共子序列算法()


  • 我建议您使用散列。创建stringList的hashMap,这样就不需要第三个循环了。相反,对于每个secObj的string属性,只要尝试从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");
              }
          }
     }
    
    HashMap map=newhashmap();
    用于(字符串:字符串列表){
    地图放置(主环,1);
    }
    对于(SomeObject对象:对象列表){
    List secobjList=obj.getSecList();
    for(第二对象secObj:secObjList){
    if(map.get(secObj.str)!=null){
    log.log(“找到匹配项”);
    }
    }
    }
    

    从O(n^3)减少到O(n^2)

    我建议您使用散列。创建stringList的hashMap,这样就不需要第三个循环了。相反,对于每个secObj的string属性,只要尝试从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");
              }
          }
     }
    
    HashMap map=newhashmap();
    用于(字符串:字符串列表){
    地图放置(主环,1);
    }
    对于(SomeObject对象:对象列表){
    List secobjList=obj.getSecList();
    for(第二对象secObj:secObjList){
    if(map.get(secObj.str)!=null){
    log.log(“找到匹配项”);
    }
    }
    }
    

    从O(n^3)减少到O(n^2)

    我需要获得找到匹配项的辅助对象。好的,这意味着您可以假设字符串是唯一的。一种更简单的方法是创建一个HashMap,只需在HashMapI中查找键,就可以获得找到匹配项的辅助对象。好的,这意味着您可以假设字符串是唯一的。一种更简单的方法是创建一个HashMap,然后在HashMap中查找键