목록을 사용하여 정확한 검색 방법 사이에 데이터베이스와 유사한 구현
코드 사본은 다음과 같습니다.
공개 최종 클래스 CommonLocalQuery <t는 map <string, object >> {을 확장합니다.
// 데이터 쿼리, 첫 번째 매개 변수 : 쿼리 목록, 두 번째 매개 변수 : 쿼리 조건을 전달한 후 리턴 목록
공개 목록 <T> QueryData (최종 목록 <T> MallList, Final Hashhashmap <정책, 문자열, 문자열>지도) {
if (malllist == null | map == null) {
새로운 ArrayList <t> ()를 반환합니다.
}
if (malllist.isempty ()) {
Malllist를 반환하십시오.
}
/* 실제 요구에 따라 일치하는 쿼리 조건을 찾으십시오*/
set <정책> key1 = map.getfirstkeys ();
for (정책 정책 : key1) {
ConsurethShasmap <String, String> tempMap = map.get (정책);
<string> key2 = tempmap.keyset ();
for (문자열 키 : key2) {
if (key.startSwith ( "-") || tempmap.get (key) == null ||
(tempmap.get (key)! = null && tempmap.get (key) .equals ( ""))) {
tempmap.remove (키);
}
}
}
// 책임 체인 설계 패턴을 찾습니다
필터 필터 filternormal, filterbetween, filterfuzzy;
filternormal = 새로운 filternormal ();
FilterBetween = New FilterBetween ();
filterfuzzy = new Filterfuzzy ();
filternormal.setfilter (FilterBetween);
FilterBetween.setFilter (FilterFuzzy);
set <polation> endkey1 = map.getfirstkeys ();
list <t> listresult = new arraylist <t> ();
for (t resmap : malllist) {
for (정책 정책 : endkey1) {
consurethashMap <string, String> QueryMap = map.get (정책);
if (filtermal.dofilter (RESMAP, POLICE, QUERYMAP) && listresult.contains (resmap)) {
listresult.add (resmap);
}
}
}
리스트리스트 리트;
}
공공 정적 열거 정책 {정상, 간, 퍼지}
}
/*======== 책임 체인 추상 클래스 ======*/
추상 클래스 필터 {
필터 필터;
public void setfilter (필터 필터) {
this.filter = 필터;
}
공개 필터 getFilter () {
반환 필터;
}
Abstract Boolean Dofilter (Map <String, Object> Resmap, 정책 정책, Map <String, String> QueryMap);
}
// 정확한 검색 방법
클래스 filternormal 확장 필터 {
@보수
부울 Dofilter (Map <String, Object> Resmap, 정책 정책, Map <String, String> QueryMap) {
// TODO 자동 생성 메소드 스텁
if (policy.name (). equalsignorecase (policy.name.name ())) {
iterator <Entry <String, String >> iterator = QueryMap.entryset (). iterator ();
while (iterator.hasnext ()) {
Entry <String, String> entry = iterator.next ();
if (! resmap.get (entry.getKey ()). toString (). contains (entry.getValue ()) {
거짓을 반환합니다.
}
}
} else if (filter! = null) {
Return Filter.Dofilter (RESMAP, 정책, 쿼리 맵);
}
진실을 반환하십시오.
}
}
// 검색 방법 사이
클래스 Filterbetweengrends Filter {
@보수
부울 Dofilter (Map <String, Object> Resmap, 정책 정책, Map <String, String> QueryMap) {
// TODO 자동 생성 메소드 스텁
if (policy.name (). equalsignorecase (정책.
iterator <Entry <String, String >> iterator = QueryMap.entryset (). iterator ();
while (iterator.hasnext ()) {
Entry <String, String> entry = iterator.next ();
if (! pattern.matches ( ".+? φ.+?", enther.getValue ()))
새로운 미지의 오류를 던지십시오 ( "값은.+? φ.+? 패턴");
문자열 firstValue = entry.getValue (). split ( "φ") [0];
문자열 secondValue = entry.getValue (). split ( "φ") [1];
if (resmap.get (entry.getkey ()). toString (). 비교 (FirstValue) <0
||. resmap (entry.getKey ()). toString (). 비교 (secondValue) {
거짓을 반환합니다.
}
}
} else if (filter! = null) {
Return Filter.Dofilter (RESMAP, 정책, 쿼리 맵);
}
진실을 반환하십시오.
}
}
// 퍼지 검색 방법
Class Filterfuzzy 확장 필터 {
@보수
부울 Dofilter (Map <String, Object> Resmap, 정책 정책, Map <String, String> QueryMap) {
// TODO 자동 생성 메소드 스텁
if (policy.name (). equalsignorecase (policy.fuzzy.name ())) {
String tempstr = resmap.values (). toString (). Replace ( "", "") .replace ( ",", "");
iterator <Entry <String, String >> iterator = QueryMap.entryset (). iterator ();
while (iterator.hasnext ()) {
Entry <String, String> entry = iterator.next ();
if (tempStr.SubString (1, tempStr.length () -1) .crantains (entry.getValue ()) {
진실을 반환하십시오.
}
}
} else if (filter! = null) {
Return Filter.Dofilter (RESMAP, 정책, 쿼리 맵);
}
진실을 반환하십시오.
}
}
// 클래스가 K1-K2-V를 구현하도록 도와줍니다
공개 클래스 해시 스타 <k1, k2, v> {
Private ConcurrenThashMap <k1, ConsurenthashMap <k2, v >> k1k2vmap;
public hashhashmap () {
this.k1k2vmap = new concurrenthashmap <k1, consurenthashmap <k2, v >> ();
}
public void put (k1 key1, k2 key2, v value) {
if (k1k2vmap.containskey (key1)) {
ConsurenThashMap <k2, v> k2vmap = k1k2vmap.get (key1);
k2vmap.put (key2, 값);
} 또 다른 {
ConsurenthashMap <k2, v> k2vmap = new ConcurrEthashMap <k2, v> ();
k2vmap.put (key2, 값);
k1k2vmap.put (key1, k2vmap);
}
}
공개 세트 <k1> getfirstkeys () {
k1k2vmap.keyset ()을 반환합니다.
}
public v get (k1 key1, k2 key2) {
ConsurenThashMap <k2, v> k2_v = k1k2vmap.get (key1);
k2_v == null : k2_v.get (key2);
}
public concurrenthashmap <k2, v> get (k1 key1) {
k1k2vmap.get (key1)을 반환합니다.
}
공개 부울은 키 (K1 key1, K2 key2) {
if (k1k2vmap.containskey (key1)) {
k1k2vmap.get (key1) .containskey (key2)를 반환합니다.
}
거짓을 반환합니다.
}
공개 부울은 키 (k1 key1) {
k1k2vmap.containskey (key1)를 반환합니다.
}
public void clear () {
if (k1k2vmap.size ()> 0) {
for (consurenthashmap <k2, v> k2vmap : k1k2vmap.values ()) {
k2vmap.clear ();
}
k1k2vmap.clear ();
}
}
}
// 특정 사용 방법
HASHHASHMAP <정책, 문자열, 문자열> map = New Hashhashmap <CommonLocalQuery.Policy, String, String> ();
for (int i = 0; i <querykey.length; i ++) {
map.put (정책. 정상, QueryKey [i], QueryValue [i]);
}
list <map <string, object >> mtemplist = new CommonLocalQuery <Hashmap <String, Object >> (