2013-02-18 30 views
3

尋找價值我有列表聲明爲在列表

 private List<Employees> employees; 

和我正在使用DAO從數據庫值

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

我想搜索在employees List的值,是什麼是在employees List中查找價值的最佳方法?

我已經試過

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

不過我正在轉換異常

任何幫助,高度讚賞。

感謝,如果你排序您的每一次列表和搜索它

+2

「尋找價值」是什麼意思?你面臨的問題是什麼? – 2013-02-18 12:21:25

+0

難道是你試圖在Employee對象列表中搜索「abc」(一個字符串)嗎? – Thevenin 2013-02-18 12:24:25

+0

@NikolayKuznetsov我有字符串稱爲「abc」,我想在'員工列表中尋找abc' – user75ponic 2013-02-18 12:25:33

回答

6
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 ExceptionCollections#sort方法,因爲你的列表中包含null value其無法施展員工和提高ClassCastException

+0

當我早些時候試過這個,我被拋出異常 – user75ponic 2013-02-18 12:27:52

+0

我更新了我的回答 – 2013-02-18 12:30:34

+0

我有'Collections.sort(employees); int index = Collections.binarySearch(employees,「abc」);'當我編譯時,我得到'類(java.util.List )沒有在類java.util.Collections' – user75ponic 2013-02-18 12:33:34

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

使用

lookingForValue("abc", employees); 
1

如果您不容使用

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); 
1

遍歷目錄並執行搜索行動:

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

如果你要搜索的Employee所有領域,你可能想創建一個Employee方法,檢查在實例的所有領域:

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

,並在您for -loop使用此方法。

+0

這是對他的問題最好的辦法? – Prateek 2013-02-18 12:26:40

+0

'最好'是有爭議的,這是他的問題的解決方案。 – Veger 2013-02-18 12:28:41

1

如果您的列表非常大,我建議在DAO中進行搜索 - dbs可以針對此類搜索的最佳性能進行調整(例如select * from employees where name = 'abc'),然後使用DAO方法僅返回匹配的項目。

另外一個不錯的替代方案是Apache的公地Predicate

matches = CollectionUtils.filter(employees, new Predicate<Employee>() 
{ 
    @Override 
    public boolean evaluate(Employee object) 

    return "abc".equals(object.getName()); 
    } 
}); 

顯然,參數化了 「ABC」。如果要重用它,請將謂詞命名爲一個已命名的類。

如果您有多種不同的方式來過濾集合,則謂詞實現特別有用;加上它等於免費的真正的平等檢查。

+1

這個答案沒有錯...... +1。將搜索傳遞到數據庫可能會避免搜索整個列表。但是,這並非總是可行的。 – 2013-02-18 12:30:01

1

您正處在正確的軌道上。簡單地覆蓋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方法。