Gunakan daftar untuk mengimplementasikan metode pencarian seperti basis data
Salinan kode adalah sebagai berikut:
Public Final Class CommonLocalQuery <T Extends Map <String, Object >> {
// Daftar Pengembalian Setelah Meneruskan Kueri Data, Parameter Pertama: Daftar Kueri, Parameter Kedua: Kondisi Kueri
Daftar Publik <T> queryData (Daftar Akhir <T> Malllist, HashhashMap Final <kebijakan, String, String> peta) {
if (malllist == null | peta == null) {
mengembalikan Daftar Array baru <T> ();
}
if (malllist.isempty ()) {
mengembalikan malllist;
}
/* Temukan kondisi kueri yang cocok berdasarkan kebutuhan aktual*/
Atur <bolicy> key1 = map.getFirstKeys ();
untuk (kebijakan kebijakan: key1) {
ConcurrenthashMap <string, string> tempmap = map.get (kebijakan);
Atur <string> key2 = tempmap.keyset ();
untuk (tombol string: key2) {
if (key.startswith ("-") || tempmap.get (key) == null ||
(tempmap.get (key)! = null && tempmap.get (key) .equals (""))) {
tempmap.remove (kunci);
}
}
}
// Temukan pola desain rantai tanggung jawab
Filter filternormal, filterbetween, filterfuzzy;
filternormal = filternormal baru ();
filterbetween = filterbetween ();
filterfuzzy = new filterfuzzy ();
filternormal.setFilter (filterbetween);
filterbetween.setFilter (filterfuzzy);
Set <bolicy> endkey1 = map.getFirstKeys ();
Daftar <T> listresult = new ArrayList <T> ();
untuk (t resmap: malllist) {
untuk (kebijakan kebijakan: endkey1) {
ConcurrenthashMap <string, string> querymap = map.get (kebijakan);
if (filternormal.dofilter (resmap, kebijakan, querymap) && listresult.contains (resmap)) {
listresult.add (resmap);
}
}
}
Kembalikan Listresult;
}
Kebijakan enum statis publik {normal, antara, fuzzy}
}
/*========= Kelas abstrak rantai tanggung jawab ======*//
filter kelas abstrak {
Filter filter;
public void setFilter (filter filter) {
this.filter = filter;
}
filter publik getFilter () {
filter pengembalian;
}
Abstrak boolean dofilter (peta <string, objek> resmap, kebijakan kebijakan, peta <string, string> querymap);
}
// Metode pencarian yang tepat
kelas filternormal meluas filter {
@Mengesampingkan
boolean dofilter (peta <string, objek> resmap, kebijakan kebijakan, peta <string, string> querymap) {
// TODO Stub Metode yang Dihasilkan Otomatis
if (policy.name (). EqualiSignorecase (policy.normal.name ())) {
Iterator <entry <string, string >> iterator = querymap.entryset (). Iterator ();
while (iterator.hasnext ()) {
Entri <string, string> entri = iterator.next ();
if (! resmap.get (entry.getKey ()). toString (). contains (entry.getValue ())) {
mengembalikan false;
}
}
} lain jika (filter! = null) {
return filter.dofilter (resmap, kebijakan, querymap);
}
Kembali Benar;
}
}
// Antara Metode Pencarian
kelas filterbetween extends filter {
@Mengesampingkan
boolean dofilter (peta <string, objek> resmap, kebijakan kebijakan, peta <string, string> querymap) {
// TODO Stub Metode yang Dihasilkan Otomatis
if (policy.name (). EqualSignorecase (policy.between.name ())) {
Iterator <entry <string, string >> iterator = querymap.entryset (). Iterator ();
while (iterator.hasnext ()) {
Entri <string, string> entri = iterator.next ();
if (! Pattern.matches (".+? φ.+?", entri.getValue ())))
Lempar tidak diketahui baru ("Nilai harus.+? φ.+? Pattern");
String firstValue = entry.getValue (). Split ("φ") [0];
String secondvalue = entry.getValue (). Split ("φ") [1];
if (resmap.get (entry.getKey ()). tostring (). compareTo (firstValue) <0
||.
mengembalikan false;
}
}
} lain jika (filter! = null) {
return filter.dofilter (resmap, kebijakan, querymap);
}
Kembali Benar;
}
}
// Metode pencarian fuzzy
kelas filterfuzzy memperluas filter {
@Mengesampingkan
boolean dofilter (peta <string, objek> resmap, kebijakan kebijakan, peta <string, string> querymap) {
// TODO Stub Metode yang Dihasilkan Otomatis
if (policy.name (). EqualiSignorecase (policy.fuzzy.name ())) {
String tempstr = resmap.values (). Tostring (). Ganti ("", "") .replace (",", "");
Iterator <entry <string, string >> iterator = querymap.entryset (). Iterator ();
while (iterator.hasnext ()) {
Entri <string, string> entri = iterator.next ();
if (tempstr.substring (1, tempstr.length ()-1) .contains (entry.getValue ()) {
Kembali Benar;
}
}
} lain jika (filter! = null) {
return filter.dofilter (resmap, kebijakan, querymap);
}
Kembali Benar;
}
}
// kelas membantu mengimplementasikan k1-k2-v
HashhashMap kelas publik <K1, K2, V> {
private concurrenthashmap <k1, concurrenthashmap <k2, v >> k1k2vmap;
hashhashmap publik () {
this.k1k2vmap = concurrenthashMap baru <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, nilai);
} kalau tidak {
ConcurrenthashMap <k2, v> k2vmap = concurrenthashmap baru <k2, v> ();
k2vmap.put (key2, nilai);
k1k2vmap.put (key1, k2vmap);
}
}
Set publik <K1> getFirstKeys () {
return k1k2vmap.keyset ();
}
public v get (k1 key1, k2 key2) {
ConcurrenthashMap <k2, v> k2_v = k1k2vmap.get (key1);
return k2_v == NULL?
}
Public ConcurrenthashMap <K2, V> Get (K1 Key1) {
return k1k2vmap.get (key1);
}
Boolean publik berisiKey (K1 KEY1, K2 KEY2) {
if (k1k2vmap.containskey (key1)) {
return k1k2vmap.get (key1) .containsKey (key2);
}
mengembalikan false;
}
Boolean publik berisiKey (K1 KEY1) {
return k1k2vmap.containskey (key1);
}
public void clear () {
if (k1k2vmap.size ()> 0) {
untuk (concurrenthashmap <k2, v> k2vmap: k1k2vmap.values ()) {
k2vmap.clear ();
}
k1k2vmap.clear ();
}
}
}
// Metode penggunaan tertentu
HashhashMap <kebijakan, string, string> peta = hashhashmap baru <commonlocalQuery.policy, string, string> ();
untuk (int i = 0; i <querykey.length; i ++) {
peta.put (policy.normal, querykey [i], queryValue [i]);
}
Daftar <peta <string, objek >> mtemplist = new CommonLocalQuery <hashmap <string, objek >> (