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):搜 ...
随机推荐
- Mysql Insert Or Update语法实例
有的时候会需要写一段insert的sql,如果主键存在,则update:如果主键不存在,则insert.Mysql中提供了这样的用法:ON DUPLICATE KEY UPDATE.下面就看看它是如何 ...
- jdk命令行工具(一)
1.概述 熟悉java开发的人应该都知道在jdk的bin目录下有许多的工具,这些工具主要用于监视虚拟机和故障处理.这些故障处理工具被Sun公司称作为“礼物”附赠给JDK的使用者,并在软件的使用说明中把 ...
- 30 个免费的 Sketch 必备插件
简评:中秋三天小长假,要不要学点啥?比如简单的设计?比如用 Sketch 做个项目? Sketch 有许多值得称赞的地方,其丰富的插件就是亮点之一.Sketch 的社区有着大量免费高效的插件.今天这篇 ...
- npm 常用配置
npm config list/ls 显示配置信息npm config list/ls -l 更详细npm -h 显示帮助信息,建议多查看npm -l display full usage info ...
- python中type、class、object的区别
type 一. type可以用来返回一个对象的类型 例如: 二. 由于Python中一切皆对象,也就是说Python中的任何变量类型都是可以被修改的,这也是Python等动态编程语言的特点.type的 ...
- (六)Audio子系统之AudioRecord.release
在上一篇文章<(五)Audio子系统之AudioRecord.stop>中已经介绍了AudioRecord如何暂停录制,接下来,继续分析AudioRecord方法中的release的实 ...
- SBC应用
在VoIP呼叫中主要使用会话发起协议(SIP),H.323和MGCP呼叫信令协议,Sbc 在主叫和被叫的信令/媒体路径之间引入. 通常,SBC隐藏网络拓扑,接管呼入并生成到新的请求分支到被叫.技术上叫 ...
- ACM练习网站
1.http://www.acmerblog.com/ Acm之家 2.http://acm.nyist.net/JudgeOnline/problemset.php 南阳理工学院
- C#多线程学习一
一.概述:C#支持多线程并行执行程序,一个线程有他单独的执行路径,能够与其他线程同时执行,一个程序是由一个单线程开始,该单线程由CLR(公共语言运行时)和操作系统创建而成,并具有多线程创建额外线程的功 ...
- js判断数组中是否有重复值得三种方法
方法一: var s = ary.join(",")+","; for(var i=0;i<ary.length;i++) { if(s.replace( ...