2009-04-10 91 views
3

有什麼方法可以在Java數據結構上執行SQL Like Queries或Filtering?查詢Java數據結構

我想過濾一個ArrayList和一個HashMap對象的字段中包含的對象。

回答

5

你可能會喜歡Quaere,這是爲Java對象圖相當豐富的查詢語言:

Integer[] numbers={5, 4, 1, 3, 9, 8, 7, 2, 0}; 
Iterable<Integer> lowNumbers= 
    from("n").in(numbers). 
    where(lt("n",5). 
    select("n"); 
3

是和否。

不,沒有SQL語法。

是的,帶過濾函子。特別是,查看Apache Commons Collections CollectionsUtils.filter()函數,該函數將Predicate對象應用於集合。

您編寫謂詞,Apache類負責其餘部分。

4

沒有標準的SQL語言,但apache commons collections has a filter方法,將做你想做的。不要太難推出自己的,

public <T> Collection<T> filter (Collection<T> c, Condition<T> condition) { 
    ArrayList<T> list = new ArrayList<T>(): 
    for (T t: c){ 
     if (condition.isSatisfied(t)) { list.add(t); } 
    } 
    return list; 
} 

public interface Condition<T> { 
    public boolean isSatisfied(T t); 
} 
1

有很多解決方案可以做到這一點,利用XPath或XQuery。初學者請看Jaxen

3

規範的方法是迭代數據結構並將所需的對象插入到新的對象中。不幸的是,Java沒有列表理解或一流的功能。但是,我們可以使用庫像Functional Java模擬他們:

import fj.F; 
import fj.data.List; 
import static fj.data.List.list; 
import static fj.pre.Show.listShow; 
import static fj.pre.Show.stringShow; 

List<String> myList = list("one", "two", "three").filter(
    new F<String, Boolean>() { 
    public Boolean f(String s) { 
     return s.contains("e"); 
    } 
    }); 

listShow(stringShow).print(myList); 

,將打印["one", "three"]到標準輸出。

0

一個相當極端的解決辦法可能是使用某種類型的ORM映射您的Java對象爲實際的SQL數據庫,然後使用實際的SQL或類似Hibernate的HQL的SQL語言來精確查詢您的對象。

當然,我只會認真考慮,如果我實際上計劃將對象保留在數據庫中,否則它是過度殺傷。