Java应用于生活中很多地方,大家可以利用java做一个简单的搜索功能,那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、初始化数据 Mapcmap = new HashMap(); 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、模糊匹配数据 MaplikeByMap = 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 MapgetLikeByMap(Mapmap, String keyLike) { /** 返回的数据map **/ Mapm = new LinkedHashMap < > (); /** 用于排序数据集合 **/ Listl = new LinkedList < > (); // 循环匹配 for (Map.Entryentity: 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; } } Listtest = 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); } } Listsort = Sort(test); Listlist = 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.Entryentity: 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 ListSort(ListstringList) { 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; } } } Listsucclist = new ArrayList(); for (int i = 0; i < arr.length; i++) { String string = arr[i]; succlist.add(i, string); } return succlist; } }
怎么实现简单搜索?
需求:从一个指定的字符串中,查找是否存在指定的关键字,有则将其按顺序找出。例如:从"我在开会,一会打电话,然后去吃饭" 查找是否含有 "教研"、"上课"、"开会"、"打电话"、"吃饭" ,结果是查找到"开会" "打电话" "吃饭"。
分析:可以简单的进行字符串扫描,对每一个关键字进行匹配,开始位置为0,扫描到则下次开始的位置加上字符串的长度。
代码如下:
package cc.dc.test; import java.util.ArrayList; import java.util.List; public class Test2 { //记录找到的关键字 private static List keywordsList = new ArrayList(); public static void main(String[] args) { //待查找的字符串 String content = "我在开会,一会打电话,然后去吃饭"; //搜索的关键字 String[] subStrings = { "打电话" , "开会" , "吃饭" }; getRemindString(content, subStrings); for (String str: keywordsList) { System.out.print(str + "--"); } } private static void getRemindString(String content, String[] subStrings) { int[] array = new int[content.length()]; for (int i = 0; i < array.length; i++) { //默认设置为10000,最后判断不是10000的位置就是关键字 array[i] = 10000; } for (int j = 0; j < subStrings.length; j++) { String findStr = subStrings[j]; // 待查找字符串的长度 int findLength = findStr.length(); for (int i = 0; i < content.length();) { if ((findLength + i) <= content.length() && content.substring(i, findLength + i) .equals(findStr)) { // 查找到的位置 //System.out.println("find " + i + "--"+ content.substring(i, findLength + i)); //找到,则设置其在subStrings的位置 array[i] = j; // 找到则下次查找的位置+字符长度 i += findLength; } else { // 没有找到则从下一个位置开始查找 i++; } if (i + findLength > content.length()) { // 如果下一次查找的endIndex>str.length()则说明不可能再有该字符串了 break; } } } for (int i = 0; i < array.length; i++) { //所有不是10000的位置都是查找到关键字的位置 if (array[i] != 10000) { //System.out.println("--" + subStrings[array[i]] + "--"); keywordsList.add(subStrings[array[i]]); } } } }
看完文章是不是觉得要实现这样的功能还是有些复杂的,其实大家不必担心,只要你能将逻辑思维理清,并用代码的形式表现出来就可以了!最后大家如果想要了解更多java实例知识,敬请关注奇Q工具网。
推荐阅读: