リストを使用して、正確な検索方法の間にデータベースのようなものを実装します
コードコピーは次のとおりです。
Public Final Class CommonLocalQuery <T拡張マップ<String、Object >> {
//データを渡した後のリストクエリ、最初のパラメーター:クエリリスト、2番目のパラメーター:クエリ条件
パブリックリスト<t> querydata(最終リスト<t>モールリスト、最終的なハッシュハッシュ<ポリシー、文字列、文字列>マップ){
if(malllist == null | map == null){
new arrayList <t>()を返します。
}
if(malllist.isempty()){
モールリストを返します。
}
/*実際のニーズに基づいて一致するクエリ条件を見つける*/
set <policy> key1 = map.getFirstKeys();
for(ポリシーポリシー:key1){
concurrenthashmap <string、string> tempmap = map.get(ポリシー);
<string> key2 = tempmap.keyset()を設定します。
for(string key:key2){
if(key.startswith( " - ")|| tempmap.get(key)== null ||
(tempmap.get(key)!= null && tempmap.get(key).equals( ""))){
tempmap.remove(key);
}
}
}
//責任チェーン設計パターンを見つけます
フィルターフィルターモルタ、フィルターベット、フィルターファジー。
filternormal = new filternormal();
filterbetween = new filterbetween();
filterfuzzy = new FilterFuzzy();
filternormal.setfilter(filterbetween);
filterbetween.setfilter(filterfuzzy);
set <policy> endkey1 = map.getFirstKeys();
List <t> listResult = new ArrayList <T>();
for(t resmap:malllist){
for(ポリシーポリシー:endkey1){
concurrenthashmap <string、string> querymap = map.get(policy);
if(filternormal.dofilter(resmap、policy、querymap)&& listresult.contains(resmap)){
listresult.add(resmap);
}
}
}
listresult;
}
public static enumポリシー{通常、間、ファジー}
}
/*=========責任チェーン抽象クラス======*/
抽象クラスフィルター{
フィルターフィルター;
public void setFilter(フィルターフィルター){
this.filter = filter;
}
パブリックフィルターgetFilter(){
返品フィルター。
}
抽象ブールドフィルター(Map <String、Object> Resmap、Policy Policy、Map <String、String> QueryMap);
}
//正確な検索方法
クラスのフィルターモルマルはフィルターを拡張します{
@オーバーライド
Boolean Dofilter(Map <String、Object> Resmap、Policy Policy、Map <String、String> QueryMap){
// TODO自動生成方法スタブ
if(policy.name()。equalsignorecase(policy.normal.name())){
iterator <entry <string、string >> iterator = querymap.entryset()。iterator();
while(iterator.hasnext()){
entry <string、string> entry = iterator.next();
if(!resmap.get(entry.getKey())。toString()。
falseを返します。
}
}
} else if(filter!= null){
return filter.dofilter(resmap、policy、querymap);
}
trueを返します。
}
}
//検索方法間
クラスフィルターはフィルターを拡張します{
@オーバーライド
Boolean Dofilter(Map <String、Object> Resmap、Policy Policy、Map <String、String> QueryMap){
// TODO自動生成方法スタブ
if(policy.name()。equalsignorecase(policy.between.name())){
iterator <entry <string、string >> iterator = querymap.entryset()。iterator();
while(iterator.hasnext()){
entry <string、string> entry = iterator.next();
if(!pattern.matches( "。+?φ。+?"、entry.getValue())))
新しいUncondError( "値は。+?φ。+?パターン");
string firstValue = entry.getValue()。split( "φ")[0];
string secondValue = entry.getValue()。split( "φ")[1];
if(resmap.get(entry.getKey())。toString()。比較(firstValue)<0
||。resmap.get(entry.getKey())。
falseを返します。
}
}
} else if(filter!= null){
return filter.dofilter(resmap、policy、querymap);
}
trueを返します。
}
}
//ファジー検索方法
クラスFilterFuzzyはフィルターを拡張します{
@オーバーライド
Boolean Dofilter(Map <String、Object> Resmap、Policy Policy、Map <String、String> QueryMap){
// TODO自動生成方法スタブ
if(policy.name()。equalsignorecase(policy.fuzzy.name())){
string tempstr = resmap.values()。toString()。falple( "" "" "、" ").Replace("、 "、" ");
iterator <entry <string、string >> iterator = querymap.entryset()。iterator();
while(iterator.hasnext()){
entry <string、string> entry = iterator.next();
if(tempsstr.substring(1、tempsstr.length() - 1).contains(entry.getValue()){
trueを返します。
}
}
} else if(filter!= null){
return filter.dofilter(resmap、policy、querymap);
}
trueを返します。
}
}
//クラスを支援するK1-K2-Vを実装します
パブリッククラスのhashhashmap <k1、k2、v> {
private concurrenthashmap <k1、concurrenthashmap <k2、v >> k1k2vmap;
public hashhashmap(){
this.k1k2vmap = new concurrenthashmap <k1、concurrenthashmap <k2、v >>();
}
public void put(k1 key1、k2 key2、v value){
if(k1k2vmap.containskey(key1)){
concurrenthashmap <k2、v> k2vmap = k1k2vmap.get(key1);
k2vmap.put(key2、value);
} それ以外 {
concurrenthashmap <k2、v> k2vmap = new concurrenthashmap <k2、v>();
k2vmap.put(key2、value);
k1k2vmap.put(key1、k2vmap);
}
}
public set <k1> getFirstKeys(){
return k1k2vmap.keyset();
}
public v get(k1 key1、k2 key2){
concurrenthashmap <k2、v> k2_v = k1k2vmap.get(key1);
k2_v == null:k2_v.get(key2);
}
public concurrenthashmap <k2、v> get(k1 key1){
k1k2vmap.get(key1)を返します。
}
public boolean containskey(k1 key1、k2 key2){
if(k1k2vmap.containskey(key1)){
k1k2vmap.get(key1).containskey(key2);
}
falseを返します。
}
public boolean containskey(k1 key1){
k1k2vmap.containskey(key1)を返します。
}
public void clear(){
if(k1k2vmap.size()> 0){
for(concurrenthashmap <k2、v> k2vmap:k1k2vmap.values()){
k2vmap.clear();
}
K1K2VMAP.CLEAR();
}
}
}
//特定の使用方法
Hashhashmap <Policy、String、String> Map = new Hashhashmap <commonLocalquery.policy、string、string>();
for(int i = 0; i <querykey.length; i ++){
map.put(policy.normal、querykey [i]、queryvalue [i]);
}
List <Map <String、Object >> mtemplist = new CommonLocalQuery <Hashmap <String、Object >>(