java如何做到任意关键词模糊搜索?怎么实现简单搜索?

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工具网。

推荐阅读:

java标识符如何定义?标识符如何命名?

java打不开jnlp文件怎么办?jnlp文件是什么?

springcloud项目实例分享