java使用list實(shí)現(xiàn)數(shù)據(jù)庫(kù)的like功能
使用list實(shí)現(xiàn)類似數(shù)據(jù)庫(kù)的like,between,精確查找方法
public final class CommonLocalQuery<T extends Map<String, Object>> {
//傳入數(shù)據(jù)查詢后返回list, 第一個(gè)參數(shù):被查詢列表,第二個(gè)參數(shù):查詢條件
public List<T> queryData(final List<T> mAllList, final HashHashMap<POLICY, String, String> map) {
if(mAllList == null | map == null) {
return new ArrayList<T>();
}
if(mAllList.isEmpty()) {
return mAllList;
}
/* 根據(jù)實(shí)際需要找出符合的查詢條件 */
Set<POLICY> key1 = map.getFirstKeys();
for (POLICY policy : key1) {
ConcurrentHashMap<String, String> tempMap = map.get(policy);
Set<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);
}
}
}
// 責(zé)任鏈設(shè)計(jì)模式進(jìn)行查找
Filter filterNormal, filterBetween, filterFuzzy;
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 (POLICY policy : endKey1) {
ConcurrentHashMap<String, String> queryMap = map.get(policy);
if (filterNormal.doFilter(resMap, policy, queryMap) && listResult.contains(resMap)) {
listResult.add(resMap);
}
}
}
return listResult;
}
public static enum POLICY { NORMAL, BETWEEN, FUZZY }
}
/*======== 責(zé)任鏈抽象類 ======*/
abstract class Filter {
Filter filter;
public void setFilter(Filter filter) {
this.filter = filter;
}
public Filter getFilter() {
return filter;
}
abstract boolean doFilter(Map<String, Object> resMap, POLICY policy, Map<String, String> queryMap);
}
//精確查找方式
class FilterNormal extends Filter {
@Override
boolean doFilter(Map<String, Object> resMap, POLICY policy, Map<String, String> queryMap) {
// TODO Auto-generated method stub
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().contains(entry.getValue())) {
return false;
}
}
} else if (filter != null) {
return filter.doFilter(resMap, policy, queryMap);
}
return true;
}
}
//between查找方式
class FilterBetween extends Filter {
@Override
boolean doFilter(Map<String, Object> resMap, POLICY policy, Map<String, String> queryMap) {
// TODO Auto-generated method stub
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()))
throw new UnknownError("Values should be .+?Φ.+? pattern");
String firstValue = entry.getValue().split("Φ")[0];
String secondValue = entry.getValue().split("Φ")[1];
if(resMap.get(entry.getKey()).toString().compareTo(firstValue) < 0
|| resMap.get(entry.getKey()).toString().compareTo(secondValue) > 0) {
return false;
}
}
} else if (filter != null) {
return filter.doFilter(resMap, policy, queryMap);
}
return true;
}
}
//模糊查找方式
class FilterFuzzy extends Filter {
@Override
boolean doFilter(Map<String, Object> resMap, POLICY policy, Map<String, String> queryMap) {
// TODO Auto-generated method stub
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).contains(entry.getValue())) {
return true;
}
}
} else if (filter != null) {
return filter.doFilter(resMap, policy, queryMap);
}
return true;
}
}
//幫助類實(shí)現(xiàn) k1-k2-v
public class 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);
} else {
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);
return k2_v == null ? null : k2_v.get(key2);
}
public ConcurrentHashMap<K2, V> get(K1 key1) {
return k1k2vMap.get(key1);
}
public boolean containsKey(K1 key1, K2 key2) {
if (k1k2vMap.containsKey(key1)) {
return k1k2vMap.get(key1).containsKey(key2);
}
return false;
}
public boolean containsKey(K1 key1) {
return 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>>(
相關(guān)文章
Java游戲服務(wù)器系列之Netty相關(guān)知識(shí)總結(jié)
今天帶大家來(lái)學(xué)習(xí)Java游戲服務(wù)器的相關(guān)知識(shí),文中對(duì)Netty作了非常詳細(xì)的介紹,對(duì)正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下2021-05-05
spring-cloud-gateway動(dòng)態(tài)路由的實(shí)現(xiàn)方法
這篇文章主要介紹了spring-cloud-gateway動(dòng)態(tài)路由的實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
spring schedule實(shí)現(xiàn)動(dòng)態(tài)配置執(zhí)行時(shí)間
這篇文章主要介紹了spring schedule實(shí)現(xiàn)動(dòng)態(tài)配置執(zhí)行時(shí)間,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
java實(shí)現(xiàn)一個(gè)掃描包的工具類實(shí)例代碼
很多框架,比如springmvc,mybatis等使用注解,為了處理注解,必然要對(duì)包進(jìn)行掃描,所以下面這篇文章主要給大家分享介紹了關(guān)于利用java如何實(shí)現(xiàn)一個(gè)掃描包的工具類,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。2017-10-10
解決SpringBoot @value注解取不到值的問(wèn)題
這篇文章主要介紹了解決SpringBoot @value注解取不到值的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
Java實(shí)現(xiàn)讀取鍵盤輸入保存到txt文件,再統(tǒng)計(jì)并輸出每個(gè)單詞出現(xiàn)次數(shù)的方法
這篇文章主要介紹了Java實(shí)現(xiàn)讀取鍵盤輸入保存到txt文件,再統(tǒng)計(jì)并輸出每個(gè)單詞出現(xiàn)次數(shù)的方法,涉及java文件I/O操作及字符串遍歷、運(yùn)算實(shí)現(xiàn)統(tǒng)計(jì)功能相關(guān)技巧,需要的朋友可以參考下2017-07-07

