代码之家  ›  专栏  ›  技术社区  ›  Jacob

在列表中查找价值

  •  3
  • Jacob  · 技术社区  · 11 年前

    我已将列表声明为

            private List<Employees> employees;
    

    在中,我使用DAO从数据库中获取值

            employees= new ArrayList<Employees>();
            employees.addAll(myDAO.getEmployees());
    

    我想在中搜索一个值 employees List ,在中寻找价值的最佳方法是什么 员工列表 ?

    我试过了

        Collections.sort(employees);
        int index = Collections.binarySearch(employees, "abc");
    

    然而,我得到了铸造例外

    非常感谢您的帮助。

    谢谢

    6 回复  |  直到 11 年前
        1
  •  6
  •   Subhrajyoti Majumder MGPJ    11 年前
    Collections.sort(employees); // BigO - nlog(n)
    int index = Collections.binarySearch(employees, new Employee("abc",...)); // BigO - log(n)
    

    如果每次对列表进行排序并进行搜索,则代码的复杂性将是 nlog(n) + log(n) 哪里 nlog(n) 用于排序列表和 log(n) 用于二进制搜索。

    最好是线性搜索列表。班轮搜索需要 BigO - n 其比先前的方法执行得更好。


    你得到了 cast Exception 在里面 Collections#sort 方法,因为您的列表包含 null value 无法铸造员工并提高 ClassCastException

        2
  •  1
  •   Ilya    11 年前
    Employees lookingForValue(String value, List<Employees> employees)
    {
        for (Employees employee : employees)
        {
           if (value.equals(employee.getFieldValue()))
           {
              return employee;
           }
        }
        return null;
    }  
    

    用法

    lookingForValue("abc", employees);
    
        3
  •  1
  •   fredcrs    11 年前

    如果你不能使用

    myDAO.getEmployees(parameter);
    

    以及在您的DAO中 放入where子句 然后你可以搜索一个对象

    Employee emp = null;
    
        for(Employee e : employees) {
           if(e.getName().equals("X"))
               emp = e;
        }
    
        if(emp != null) {
          //handle the found employee
        }
        else {
          //employee not in list
        }
    

    当然,你也可以重写它的equals方法,用该列实例化一个对象并使用(我不建议使用)

    myDAO.getEmployees().get(object);
    
        4
  •  1
  •   Veger    11 年前

    遍历列表并执行搜索操作:

    String searchString = "abc";
    for(Employee employee: employees) {
      if(employee.getName().equals(searchString)) {
        // Found something!
      }
    }
    

    如果要搜索的所有字段 Employee ,您可能想在中创建一个方法 受雇者 检查实例上的所有字段:

    boolean findString(String searchString) {
      if(getName().equals(searchString)) return true;
      if(getCity().equals(searchString)) return true;
      // etc..
      return false;
    }
    

    并在您的 for -循环。

        5
  •  1
  •   Jaco Van Niekerk    11 年前

    你走在了正确的轨道上。只需覆盖Employees中的equals方法(这不应该是Employee吗?它描述的是员工的集合还是只有一个?)

    然后您的代码应该可以工作了。您也可以按上述方式对员工进行排序,并提供一个比较:

    Collections.sort(fields, new Comparator<Employee>() {
        @Override
        public int compare(Employee o1,Employee o2) {
            // TODO Rerturn 0 if equal or either 1 or -1 depending which of o1 or o2 is the bigger
        }
    })
    

    在后一种方法中,您不需要覆盖equals方法。

        6
  •  1
  •   sbk    11 年前

    如果您的列表非常大,我建议在DAO中进行搜索-可以调整dbs以获得此类搜索的最佳性能(例如 select * from employees where name = 'abc' )然后有一个DAO方法,只返回匹配的项。

    另一个不错的替代方案是apachecommons Predicate

    matches = CollectionUtils.filter(employees, new Predicate<Employee>()
    {
      @Override
      public boolean evaluate(Employee object)
    
        return "abc".equals(object.getName());
      }
    });
    

    显然,要将“abc”参数化。如果要重用谓词,请将其作为命名类。

    如果您有许多不同的方式来过滤集合,那么谓词实现尤其有用;此外,它为真正的相等性检查留出了空闲的相等性。