2009-04-10 95 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语言来精确查询您的对象。

当然,我只会认真考虑,如果我实际上计划将对象保留在数据库中,否则它是过度杀伤。