例如:
我在UI方面有一个这样的表:
这是包含上述所有数据的列表:
List<MyBean> myList;
现在,我希望使用以下方法按categoryName
,languageID
或categoryID
进行搜索:
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
提前致谢。
答案 0 :(得分:6)
Hamcrest (hamcrest-all-1.3.jar) - http://hamcrest.googlecode.com/files/hamcrest-all-1.3.jar
Lambdaj (lambdaj-2.4-with-dependencies.jar) - http://lambdaj.googlecode.com/files/lambdaj-2.4-with-dependencies.jar
然后我通过这种方式导入了以下命名空间:
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?
而不是ListTable<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") {
...
}