3

例えば:

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

2番目のケース: List<Bean> results = this.search(myList, "categoryName", "Dog House");

(この時点で、resultsリストはどちらの場合も3つの要素を返します-上記の表によると)。


これを達成することは可能ですか?ご覧のとおり、これは%LIKE%関数に似ていますSQLが、焦点を当てた検索の一種です。java.util.List

前もって感謝します。

4

4 に答える 4

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

その行の残りのコードは理解しやすいので、それについては書きません。

これが他の誰かにも役立つことを願っています。

于 2012-08-07T05:13:51.160 に答える
3

これが2つのアプローチです

「強力な」アプローチ;)

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

また、条件と検索方法は一般的であるため、さまざまなタイプのオブジェクトで再利用できます。

于 2012-08-07T04:37:18.603 に答える
2

サードパーティのライブラリを使用する場合は、おそらくJoSQLで十分ですか?これにより、SQLクエリを使用してPOJOのコレクションをフィルタリングできます...

また、SQLクエリから離れることをいとわない場合は、この古い投稿が興味深いかもしれません。Java(Criteria / SQLのような)でオブジェクトコレクションをどのようにクエリしますか?

于 2012-08-07T05:02:06.037 に答える
0

リストの代わりに、Guavaのテーブルを使用してみませんか?

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") { 
    ...
}
于 2012-08-07T04:08:15.553 に答える