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;
	}

}

  博客地址:http://blog.mojxtang.com

Java实现类似类似百度搜索模糊关键字的更多相关文章

  1. Ruby用百度搜索爬虫

    Ruby用百度搜索爬虫 博主ruby学得断断续续,打算写一个有点用的小程序娱乐一下,打算用ruby通过百度通道爬取网络信息. 第三方库准备 mechanize:比较方便地处理网络请求,类似于Pytho ...

  2. C#+Selenium抓取百度搜索结果前100网址

    需求 爬取百度搜索某个关键字对应的前一百个网址. 实现方式 VS2017 + Chrome .NET Framework + C# + Selenium(浏览器自动化测试框架) 环境准备 创建控制台应 ...

  3. JavaScript实现模糊推荐的input框(类似百度搜索框)

    如何用JS实现一个类似百度搜索框的输入框呢,再填充完失去焦点时,自动填充配置项,最终效果如下图: 实现很简单,但是易用性会上升一大截,需要用到的有jquery-ui的autocomplete,jque ...

  4. Ajax以及类似百度搜索框的demo

    public class Ajax01 extends HttpServlet{ @Override protected void service(HttpServletRequest request ...

  5. js/jQuery实现类似百度搜索功能

    一.页面代码:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www. ...

  6. vue 使用watch监听实现类似百度搜索功能

    watch监听方法,watch可以监听多个变量,具体使用方法看代码: HTML: <!doctype html> <html lang="en"> < ...

  7. 百度搜索 “Java面试题” 前200页(面试必看)

    前言 本文中的题目来源于网上的一篇文章<百度搜索 "Java面试题" 前200页>,但该文章里面只有题目,没有答案.因此,我整理了一些答案发布于本文.本文整理答案的原则 ...

  8. 安卓贴图源码--->单点触控.多点触控.类似in/百度魔图

    效果如图: 类似in,百度魔图,的贴图功能  核心的地方:单/多点 旋转缩放后记录各个顶点小图标位置 引用这里 http://blog.csdn.net/xiaanming/article/detai ...

  9. 百度搜索URL参数 搜索关键字

    http://www.baidu.com/s?wd=关键字 wd(Keyword):查询的关键词: http://www.baidu.com/s?wd=关键字&cl=3 cl(Class):搜 ...

随机推荐

  1. Hibernate 干货

    一 .hibernate概念: hibernate应用在javaee 三层框架中的dao层(web 层 --service层--dao层),在dao层实现对数据库的CRUD操作.hibernate是对 ...

  2. 任意模数NTT和FFT的玄学优化学习笔记

    本来一直都是写\(7\)次的\(MTT\)的--然后被\(shadowice\)巨巨调教了一通之后只好去学一下\(4\)次的了-- 简单来说就是我们现在需要处理一类模数不为\(NTT\)模数的情况 这 ...

  3. [ActionScript3.0] 使用FileReference处理单个文件的上载

    package { import flash.display.SimpleButton; import flash.display.Sprite; import flash.errors.Illega ...

  4. delphi 10.2---非常简单的数组用法求和

    unit Unit9; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System ...

  5. Java中HashMap的hash分布策略的简单解释

    趴源码是看到一段不可思议的代码,网上的解释似乎不大令人满意,因此稍微花点时间解读了一下,如有错误请指正 HashMap的桶是这样搞的 // 片段1 static final int hash(Obje ...

  6. LTE:EPC

    User Identifiers - IMSI and GUTI IMSI   A globle id that unique identifies a subscribe.It composed t ...

  7. 认识CSS中字体图标

    前端之HTML,CSS(十一) 字体图标 使用文字做出小图标的效果并超越了小图标应用精灵图,使得图标变得灵活,减少了请求次数,优化了界面的性能.字体图标本身为矢量图. 字体图标的使用过程 1.UI设计 ...

  8. C# TCPClient简单示例

    示例使用方法参考 示例 以下一个简单的异步事件TCP客户端实现 using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; usi ...

  9. Java学习之路(七):泛型

    泛型的概述和基本使用 作用:把类型明确的工作推前到创建对象或者调用方法的时候 泛型是一种参数化类型,把类型当做参数一样传递来明确集合的元素类型 泛型的好处 提高安全性 省去强转的麻烦 泛型的基本使用 ...

  10. Hive的Shell里hive> 执行操作时,出现FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask错误的解决办法(图文详解)

    不多说,直接上干货! 这个问题,得非 你的hive和hbase是不是同样都是CDH版本,还是一个是apache版本,一个是CDH版本. 问题详情 [kfk@bigdata-pro01 apache-h ...