如何按java.Util.List <type>?</type>中的条件搜索元素

时间:2012-08-07 04:01:45

标签: java arraylist

例如:

我在UI方面有一个这样的表:

enter image description here

这是包含上述所有数据的列表:

List<MyBean> myList;

现在,我希望使用以下方法按categoryNamelanguageIDcategoryID进行搜索:

private List<MyBean> search(List<MyBean> myList, String columnName, String criteria)

那么我只需要执行以下操作即可获得符合我标准的结果:

第一个案例: List<Bean> results = this.search(myList, "categoryName", "Dog H");

第二种情况: List<Bean> results = this.search(myList, "categoryName", "Dog House");

(此时results列表将在两种情况下返回3个元素 - 根据上表。


有可能实现这一目标吗?正如大家们所看到的,这是一种类似于%LIKE% SQL函数的搜索,但重点是java.util.List

提前致谢。

4 个答案:

答案 0 :(得分:6)

我使用以下内容解决了我的问题:

然后我通过这种方式导入了以下命名空间:

import static ch.lambdaj.Lambda.*;

使用此标准从我的标准中获得结果:

List<MyBean> results = select(myList, having(on(MyBean.class).getCategoryName(), org.hamcrest.Matchers.containsString("Dog H")));

所以,在那行代码中,我正在传递myList"column"criteria,正如我在问题中所要求的那样。

该行的其余代码很容易理解,所以我不会写它。

希望这也有助于其他人。

答案 1 :(得分:3)

这是两种方法

“有力”的方法;)

public List<MyBean> search(List<MyBean> lstBeans, String method, String regExp) {
    List<MyBean> lstMatch = new ArrayList<>(lstBeans.size());
    Pattern pattern = Pattern.compile(regExp);
    for (MyBean bean : lstBeans) {

        if (method.equals("categoryName")) {
            String name = bean.getCategoryName();
            if (pattern.matcher(name).matches()) {
                lstMatch.add(bean);
            }
        }
    }
    return lstMatch;
}

.
.
.

List<MyBean> matches = search(lstBeans, "categoryName", "^Dog.*$");

基本上,这依赖于知道给定的方法名称将返回给定的结果,这将使得难以过滤类别上的结果,例如......

人们在拼写方法名称时也存在问题,或者没有考虑到它是区分大小写的......

你可以尝试更多变量

public interface Criteria<T> {
    public boolean matches(T bean);
}

public class CategoryNameCriteria implements Criteria<MyBean> {

    private Pattern pattern;

    public CategoryCriteria(String criteria) {
        pattern = Pattern.compile(criteria);
    }

    @Override
    public boolean matches(MyBean bean) {
        return pattern.matcher(bean.getCategoryName()).matches();
    }

}

public <T> List<T> search(List<T> lstBeans, Criteria<T> critera) {
    List<T> lstMatch = new ArrayList<>(lstBeans.size());
    for (T bean : lstBeans) {
        if (critera.matches(bean)) {
            lstMatch.add(bean);
        }
    }
    return lstMatch;
}

.
.
.

matches = search(lstBeans, new CategoryNameCriteria("^Dog.*$"));

这将允许您“定义”自己的标准和匹配要求,而无需更改基本方法

这意味着您可以开发一系列独立于搜索方法的标准,例如

public class CategoryIDCriteria implements Criteria<MyBean> {

    private int id;

    public CategoryIDCriteria(int id) {
        this.id = id;
    }

    @Override
    public boolean matches(MyBean bean) {
        return bean.getCategoryID() == id;
    }

}

.
.
.

matches = search(lstBeans, new CategoryIDCriteria(1));

因为标准和搜索方法是通用的,所以可以将它与不同类型的对象一起重用

答案 2 :(得分:2)

如果您愿意使用第三方库,或许JoSQL就足够了?它允许您使用SQL查询过滤POJO集合...

此外,如果您愿意放弃SQL查询,可能会对此旧帖子感兴趣:How do you query object collections in Java (Criteria/SQL-like)?

答案 3 :(得分:0)

为什么不使用Guava的Table

而不是List
Table<Integer, Integer, String> table = HashBasedTable.create(); 
table.put(1, 1, "Advantage Flea");
table.put(1, 2, "Advantage Flea");
table.put(1, 3, "Advantage Flea");
.
.
.

案例#1需要以下内容:

Collection<String> values = table.values();
for(String value : values) { 
   if(value.contains(queryString) { 
       //found it!
   }
}

案例#2是微不足道的,看起来像:

if(table.containsValue("Advantage Flea") { 
    ...
}