java使用list实现数据库的like功能

 更新时间:2014年04月02日 09:06:10   作者:  
这篇文章主要介绍了java使用list实现数据库的like功能,需要的朋友可以参考下

使用list实现类似数据库的like,between,精确查找方法

复制代码 代码如下:

public final class CommonLocalQuery<T extends Map<String, Object>> {

 //传入数据查询后返回list, 第一个参数:被查询列表,第二个参数:查询条件
 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;
  }

  /* 根据实际需要找出符合的查询条件 */
  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);
    }
   }
  }
// 责任链设计模式进行查找
  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 }
}

/*======== 责任链抽象类 ======*/
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;
 }
}


//帮助类实现 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>>(

相关文章

  • springboot中使用rabbitt的详细方法

    springboot中使用rabbitt的详细方法

    这篇文章主要介绍了springboot中使用rabbitt,通过本文学习让我们了解如何在Spring Boot中使用RabbitMQ,并使用不同的交换机和队列类型以及消息确认模式,需要的朋友可以参考下
    2023-05-05
  • Java游戏服务器系列之Netty相关知识总结

    Java游戏服务器系列之Netty相关知识总结

    今天带大家来学习Java游戏服务器的相关知识,文中对Netty作了非常详细的介绍,对正在学习java的小伙伴们有很好的帮助,需要的朋友可以参考下
    2021-05-05
  • Java生成压缩文件的实例代码

    Java生成压缩文件的实例代码

    在工作过程中,需要将一个文件夹生成压缩文件,然后提供给用户下载。下面通过实例代码给大家介绍Java生成压缩文件的方法,感兴趣的朋友一起看看吧
    2018-06-06
  • spring-cloud-gateway动态路由的实现方法

    spring-cloud-gateway动态路由的实现方法

    这篇文章主要介绍了spring-cloud-gateway动态路由的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Java如何打印完整的堆栈信息

    Java如何打印完整的堆栈信息

    这篇文章主要为大家介绍了Java如何打印完整的堆栈信息示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • spring schedule实现动态配置执行时间

    spring schedule实现动态配置执行时间

    这篇文章主要介绍了spring schedule实现动态配置执行时间,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • java实现一个扫描包的工具类实例代码

    java实现一个扫描包的工具类实例代码

    很多框架,比如springmvc,mybatis等使用注解,为了处理注解,必然要对包进行扫描,所以下面这篇文章主要给大家分享介绍了关于利用java如何实现一个扫描包的工具类,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。
    2017-10-10
  • Spring Boot webflux使用方法解析

    Spring Boot webflux使用方法解析

    这篇文章主要介绍了Spring Boot webflux使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 解决SpringBoot @value注解取不到值的问题

    解决SpringBoot @value注解取不到值的问题

    这篇文章主要介绍了解决SpringBoot @value注解取不到值的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java实现读取键盘输入保存到txt文件,再统计并输出每个单词出现次数的方法

    Java实现读取键盘输入保存到txt文件,再统计并输出每个单词出现次数的方法

    这篇文章主要介绍了Java实现读取键盘输入保存到txt文件,再统计并输出每个单词出现次数的方法,涉及java文件I/O操作及字符串遍历、运算实现统计功能相关技巧,需要的朋友可以参考下
    2017-07-07

最新评论