Java实现类似类似百度搜索模糊关键字
package com.test; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.UUID; import net.sf.json.JSONArray; import net.sf.json.JSONObject; public class Test { static boolean flag = true;// 默认使用名称去排序 static String msg = "{\"code\":17,\"resut\":1,\"msg\":\"根据商圈管理员ID获取所有的商家\",\"data\":{\"list\":[{\"name\":\"美宜佳\",\"id\":3},{\"name\":\"老王面馆\",\"id\":4},{\"name\":\"大润发\",\"id\":5},{\"name\":\"阿卡丽弄\",\"id\":6},{\"name\":\"555\",\"id\":9},{\"name\":\"好了咯JJ\",\"id\":11},{\"name\":\"路路通\",\"id\":14},{\"name\":\"钟表店\",\"id\":15},{\"name\":\"bloom弄\",\"id\":16},{\"name\":\"上班车啊\",\"id\":18},{\"name\":\"1额考虑欧诺LOL\",\"id\":19}]}}"; public static void main(String[] args) { // 1、初始化数据 Map<String, Integer> cmap = new HashMap<String, Integer>(); JSONObject fromObject = JSONObject.fromObject(msg); JSONArray jsonArray = fromObject.getJSONObject("data").getJSONArray("list"); for (Object object : jsonArray) { JSONObject j = (JSONObject) object; String name = j.getString("name"); int id = j.getInt("id"); cmap.put(name, id); } // 2、加入假数据 for (int i = 0; i < 1000; i++) { UUID uuid = UUID.randomUUID(); String random = uuid.toString().replaceAll("-", "").substring(0, 8); int intFlag = (int) (Math.random() * 10000); cmap.put(random, intFlag); } System.out.println("-------------------数据插入完毕----------------------------"); long currentTimeMillis = System.currentTimeMillis(); // 3、模糊匹配数据 Map<String, Integer> likeByMap = getLikeByMap(cmap, "a"); System.out.println("模糊查询到的结果:\n" + likeByMap); long currentTimeMillis2 = System.currentTimeMillis(); System.out.println("使用时间:" + (currentTimeMillis2 - currentTimeMillis)); } /** * Map集合模糊匹配 * * @param map map集合 * @param keyLike 模糊key * @return {a1=1,a1899=1899} */ public static Map<String, Integer> getLikeByMap(Map<String, Integer> map, String keyLike) { /** 返回的数据map **/ Map<String, Integer> m = new LinkedHashMap<>(); /** 用于排序数据集合 **/ List<String> l = new LinkedList<>(); // 循环匹配 for (Map.Entry<String, Integer> entity : map.entrySet()) { String key = entity.getKey(); String integer = map.get(key) + ""; if (key.equals(keyLike)) {// 判断名称完全相等 String a = key + "&" + integer; l.add(0, a);// 放在第一位 continue; } if (integer.equals(keyLike)) {// 判断ID完全相等 String a = key + "&" + integer; l.add(0, a);// 放在第一位 flag = false; continue; } if (key.indexOf(keyLike) > -1) {// 判断key值 String a = key + "&" + integer; l.add(a); } if (integer.indexOf(keyLike) > -1) {// 判断value String a = key + "&" + integer; l.add(a); } } // 将数据长短进行排序 // 将第一个数据取出,不排序 // 判断第一个是否为完全匹配到的 if (null != l) { if (l.size() > 0) { String one = l.get(0); if (one.contains("&")) { String[] split = one.split("&"); String name = split[0]; String id = split[1]; if (name.equals(keyLike) || id.equals(keyLike)) { l.remove(0); } else { one = null; } } List<String> test = new LinkedList<>(); if (flag) {// 名称 for (String string : l) { String[] split = string.split("&"); String name = split[0]; test.add(name); } } else {// ID for (String string : l) { String[] split = string.split("&"); String id = split[1]; test.add(id); } } List<String> sort = Sort(test); List<String> list = new LinkedList<>(); if (flag) { for (int i = 0; i < sort.size(); i++) { String string = sort.get(i).toString(); Integer integer = map.get(string); list.add(i, string + "&" + integer); } } else { for (int i = 0; i < sort.size(); i++) { String string = sort.get(i); for (Map.Entry<String, Integer> entity : map.entrySet()) { String key = entity.getKey(); String integer = map.get(key) + ""; if (integer.equals(string)) { list.add(i, key + "&" + integer); } } } } if (null != one) { list.add(0, one); } for (String res : list) { String[] split = res.split("&"); String name = split[0]; String id = split[1]; m.put(name, Integer.valueOf(id)); } } } return m; } /** * 排序 * * @param stringList * @return */ public static List<String> Sort(List<String> stringList) { String[] arr = stringList.stream().toArray(String[]::new); for (int i = 0; i < arr.length - 1; i++) {// 外层循环控制排序趟数 for (int j = 0; j < arr.length - 1 - i; j++) {// 内层循环控制每一趟排序多少次 if (arr[j].length() > arr[j + 1].length()) { String temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } List<String> succlist = new ArrayList<String>(); for (int i = 0; i < arr.length; i++) { String string = arr[i]; succlist.add(i, string); } return succlist; } }
Java实现类似类似百度搜索模糊关键字的更多相关文章
- Ruby用百度搜索爬虫
Ruby用百度搜索爬虫 博主ruby学得断断续续,打算写一个有点用的小程序娱乐一下,打算用ruby通过百度通道爬取网络信息. 第三方库准备 mechanize:比较方便地处理网络请求,类似于Pytho ...
- C#+Selenium抓取百度搜索结果前100网址
需求 爬取百度搜索某个关键字对应的前一百个网址. 实现方式 VS2017 + Chrome .NET Framework + C# + Selenium(浏览器自动化测试框架) 环境准备 创建控制台应 ...
- JavaScript实现模糊推荐的input框(类似百度搜索框)
如何用JS实现一个类似百度搜索框的输入框呢,再填充完失去焦点时,自动填充配置项,最终效果如下图: 实现很简单,但是易用性会上升一大截,需要用到的有jquery-ui的autocomplete,jque ...
- Ajax以及类似百度搜索框的demo
public class Ajax01 extends HttpServlet{ @Override protected void service(HttpServletRequest request ...
- js/jQuery实现类似百度搜索功能
一.页面代码:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www. ...
- vue 使用watch监听实现类似百度搜索功能
watch监听方法,watch可以监听多个变量,具体使用方法看代码: HTML: <!doctype html> <html lang="en"> < ...
- 百度搜索 “Java面试题” 前200页(面试必看)
前言 本文中的题目来源于网上的一篇文章<百度搜索 "Java面试题" 前200页>,但该文章里面只有题目,没有答案.因此,我整理了一些答案发布于本文.本文整理答案的原则 ...
- 安卓贴图源码--->单点触控.多点触控.类似in/百度魔图
效果如图: 类似in,百度魔图,的贴图功能 核心的地方:单/多点 旋转缩放后记录各个顶点小图标位置 引用这里 http://blog.csdn.net/xiaanming/article/detai ...
- 百度搜索URL参数 搜索关键字
http://www.baidu.com/s?wd=关键字 wd(Keyword):查询的关键词: http://www.baidu.com/s?wd=关键字&cl=3 cl(Class):搜 ...
随机推荐
- [JS] 瀑布流加载
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ...
- 基于wavesurfer.js的超大音频的渐进式请求实现
最近在对超大音频的渐进式请求实现上面消耗了不少时间,主要是因为一对音频的基本原理不太理解,二刚开始的时候太依赖插件,三网上这块的资料找不到只能靠自己摸索.由于交互复杂加上坑比较多,我怕描述不清,这里主 ...
- GoLand 调试 Go
Goland 调试 Go 从百度得知 VS Code 不能很好的支持 Go 的调试真让人肝儿疼 -- 引言 准备 Win 10 Pro Go(Version 1.10) GoLand(2018.3) ...
- Polycarp Restores Permutation
http://codeforces.com/contest/1141/problem/C一开始没想法暴力的,next_permutation(),TLE 后来看了这篇https://blog.csdn ...
- [LibreOJ #2983]【WC2019】数树【计数】【DP】【多项式】
Description 此题含有三个子问题 问题1: 给出n个点的两棵树,记m为只保留同时在两棵树中的边时连通块的个数,求\(y^m\) 问题2: 给出n个点的一棵树,另外一棵树任意生成,求所有方案总 ...
- Android手游2048核心功能
private void swipeUp(){ //向上滑动函数 for (int x = 0; x < 4; x++) { //行从上到下 for (int y = 0; y < 4; ...
- 通过CGI实现在Html页面上执行shell命令
在mac上配置cgi(不用系统自带的apache cgi.) 安装cgi 1. brew update 2. brew install httpd24 安装完后,会有如下提示 DocumentRoot ...
- asp.net 网站在Apache下的配置,就这么简单
asp.net 网站在Apache下的配置,就这么简单 # # Virtual Hosts # # If you want to maintain multiple domains/hostnames ...
- C# 文件读写系列三
1.读写文本文件 在C# 文件读写系列二中列举了相当多的读写文本文件的方法,大致有以下几种: (1).通过静态类File的静态方法来进行文本文件的读写,主要有ReadAllBytes().ReadAl ...
- 解决emacs配置tern报错`tern-reparse-on-idle':
使用Nodejs安装完tern后,在/user/local/bin建立软连接