实现List按与一个字符串的相似度和字母顺序排序(适用于模糊查询后的排序)
因公司业务需要,自己写了一个,保存起来以后可能还会用到。如果还有更好的方法或者算法,希望大家提出来。
1、简单的相似度算法(自己想到的)
因为List中每个String都会包含一个标准的字符串,那么每个字符串除了标准字符串的左边或者右边都会有一定量的字符。相似度的定义是多出来的字符*100(只适用与在标准字符串左边最多还多出99字符的字符串,可以根据情况扩大)+标准字符串左边的字符的个数。例:标准字符串是"abc",那么字符串"abcd"与标准字符串的相似度是100,字符串"dabc"与标准字符串的相似度是101,字符串"xabcz"与标注字符串的相似度是201,字符串"xzabc"与标准字符串的相似度是202。因此这里定义的相似度最小为0,其越小就越接近标准字符串。说到这里这个就不应该就相似度、应该叫偏差度。
- private static Integer getSemblance(String toBeComparedString, String standardString){
- if(StringUtils.isBlank(toBeComparedString) || StringUtils.isBlank(standardString)){
- LOGGER.error("出错,待比较的字符串或标注字符串为空");
- return null;
- }
- Integer diffIndex = toBeComparedString.length() - standardString.length();
- if(diffIndex<0){
- LOGGER.error("出错,待比较的字符串比标准的字符串还要短");
- return null;
- }
- Integer headDiffIndex = toBeComparedString.indexOf(standardString);
- if(headDiffIndex<0){
- LOGGER.error("出错,待比较的字符串不包含标准字符串");
- return null;
- }
- return diffIndex*100+headDiffIndex;
- }
相似度算法
2、java中快速排序的方法(可以自定义排序规则)
jave中的java.util.Comparator。Comparator<T>是一个快速排序的接口,只要写个类实现接口的排序规则的方法就行。
- /**
- * File Name:Sort.java
- * Package Name:[packName]
- * Date:2015年11月12日上午10:57:14
- * Copyright (c) 2015年11月12日, Pwenlee All Rights Reserved.
- *
- */
- package com.olymtech.cs.openplatform.ds.service.impl;
- import java.util.Comparator;
- /**
- * ClassName:Sort <br/>
- * Function: 字符串compaer排序. <br/>
- * Reason: TODO ADD REASON. <br/>
- * Date: 2015年11月12日 上午10:57:14 <br/>
- * @author PwenLee
- * @version
- * @see
- */
- public class Sort implements Comparator<String> {
- /**
- * Function: 字符串排序的规则. <br/>
- * @Date: 2015年11月12日 上午10:57:14 <br/>
- * @author PwenLee
- */
- @Override
- public int compare(String arg0, String arg1) {
- if(arg0.compareTo(arg1)>0){
- return 1;
- }else if(arg0.compareTo(arg1)<0){
- return -1;
- }else{
- return 0;
- }
- }
- }
实现compare方法的类
- //new后面是实现compare的类
- Comparator<String> comparator = new Sort();
- Collections.sort(List, comparator);
java.util.Comparator的用法
3、主算法
- 1 1 public static List<String> sort(List<String> toBeComparedStringList, String standardString){
- 2 2 List<String> listAfterSort = new ArrayList<String>();
- //定义待比较字符串List的相似度的List
- List<Integer> listSemblance = new ArrayList<Integer>();
- if(toBeComparedStringList.size()<=0){
- System.out.println("出错,待比较的字符串为空");
- return null;
- }
- //初始化相似度的List
- for(int i=0;i<toBeComparedStringList.size();i++){
- listSemblance.add(getSemblance(toBeComparedStringList.get(i),standardString));
- }
- while(true){
- //循环的终止条件,当相似度的List里面全是Integer的最大值就跳出循环
- if((Integer)Collections.min(listSemblance).intValue() == Integer.MAX_VALUE.intValue()){
- break;
- }
- else{
- //取到相似度最小的位置
- Integer minIndex = getMinIndex(listSemblance);
- //并记录初始的相似度
- Integer origSemblance = listSemblance.get(minIndex);
- //将这个位置的相似度置为Integer的最大值
- listSemblance.set(minIndex, Integer.MAX_VALUE);
- if(origSemblance.intValue() != listSemblance.get(getMinIndex(listSemblance)).intValue()){
- //如果相似度List中没有和初始相似度相同的
- //则取出待排序List对应位置的字符串
- String minString = toBeComparedStringList.get(minIndex);
- listAfterSort.add(minString);
- }else{
- //如果相似度List中还有有和初始相似度相同的 则还原该位置相似度的初始值
- listSemblance.set(minIndex, origSemblance);
- List<String> tempList = new ArrayList<String>();
- //将相似度List中的所有该相似度的位置记下,将这些位置的相似度置为Integer的最大值,并取出待排序List中对应的String
- for(int i=0;i<listSemblance.size();i++){
- if(listSemblance.get(i).intValue == origSemblance.intValue){
- listSemblance.set(i, Integer.MAX_VALUE);
- tempList.add(toBeComparedStringList.get(i));
- }
- }
- //将相似度相同的临时的List进行排序
- Collections.sort(tempList, comparator);
- listAfterSort.addAll(tempList);
- }
- }
- }
- return listAfterSort;
- }
排序算法
附件中是源码,还包括了排序后截取自定义size的方法。
链接:http://pan.baidu.com/s/1hqpW8b6 密码:6mn1
实现List按与一个字符串的相似度和字母顺序排序(适用于模糊查询后的排序)的更多相关文章
- 【Django+Element UI】使用一个接口文件,搞定分页获取数据,模糊查询后分页获取数据
1:序列化获取数据的接口设计 1:分页获取序列化数据 2:是个能传参数的接口 class Society(APIView): def post(self, request): keywords = s ...
- java中输出一个字符串里面的空格,字母还有数字的数目举例说明
9.6 About string,"I am a teacher",这个字符串中有多少个字,且分别把每个字打印出来. /*本题的思路就是,当我有一个字符串,我需要一个一个字符的处理 ...
- shell if判断(曾经被一个字符串相等的判断纠结半小时,最后只是if后少了个空格!) 和 awk引用外部变量判断
一.if判断 数字: $A=12 $B=15 if(("$A"<"$B")) if(("$A"=="$B")) 字 ...
- 对于一个字符串,请设计一个高效算法,找到第一次重复出现的字符。 给定一个字符串(不一定全为字母)A及它的长度n。请返回第一个重复出现的字符。保证字符串中有重复字符,字符串的长度小于等于500。
// 第一种方法 // ConsoleApplication10.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include < ...
- java怎么实现统计一个字符串中字符出现的次数
问题:假设字符串仅仅保护a-z 的字母,java怎么实现统计一个字符串中字符出现的次数?而且,如果压缩后的字符数不小于原始字符数,则返回. 处理逻辑:首先拆分字符串,以拆分出的字符为key,以字符出现 ...
- 使用mybatis开发Dao的原始方法,实现根据用户id查询一个用户信息 、根据用户名称模糊查询用户信息列表 、添加用户信息等功能
1.需求 将下边的功能实现Dao: 根据用户id查询一个用户信息 根据用户名称模糊查询用户信息列表 添加用户信息 2. 原始Dao开发方法需要程序员编写Dao接口和Dao实现类 3.User.xml映 ...
- 判断一个字符串str不为空的方法
1.str == null; 2."".equals(str); 3.str.length 4.str.isEmpty(); 注意:length是属性,一般集合类对象拥有的属性,取 ...
- 如何识别一个字符串是否Json格式
前言: 距离上一篇文章,又过去一个多月了,近些时间,工作依旧很忙碌,除了管理方面的事,代码方面主要折腾三个事: 1:开发框架(一整套基于配置型的开发体系框架) 2:CYQ.Data 数据层框架(持续的 ...
- 字符串混淆技术应用 设计一个字符串混淆程序 可混淆.NET程序集中的字符串
关于字符串的研究,目前已经有两篇. 原理篇:字符串混淆技术在.NET程序保护中的应用及如何解密被混淆的字符串 实践篇:字符串反混淆实战 Dotfuscator 4.9 字符串加密技术应对策略 今天来 ...
随机推荐
- Python成长笔记 - 基础篇 (七)python面向对象
三大特性: 1.封装:在类中对数据赋值.内部调用对外部用户是透明的,这使类变成了一个胶囊或容器,里面包含着类的数据和方法 2.继承:一个类可以派生出子类,在父类中定义的属性.方法会自动被子类继承 ...
- c#编程指南(十) 平台调用P-INVOKE完全掌握, 字符串和指针
可以说新手使用P-INVOKE最开始的头疼就是C#和C++的字符串传递,因为这里涉及到两个问题. 第一:C#的string和C++的字符串首指针如何对应. 第二:字符串还有ANSI和UNICODE(宽 ...
- 查询指定网段可用IP脚本
1.脚本内容: #vi hhh 添加以下内容: #!/bin/bash read -p "Please keyin the network segment: (e.g. 10.88.1) & ...
- python安装MySQLdb模块
以Ubuntu下安装为例: 下载地址:https://pypi.python.org/pypi/MySQL-python/ 解压后直接进入解压目录运行安装命令. python setup.py ins ...
- halcon读取一张照片,并转化为灰度图像
dev_close_window () read_image (Image, 'E:/图片/123.jpg') get_image_size (Image, Width, Height) dev_op ...
- MyEclipse 自带的TomCat 新增部署的时候不显示 Deploy Location
项目总是报错,添了删,删了又添了N次以后,发现添加部署的时候,Deploy Location 没有值了,Deploy Location 没有值在自带的Tomcat上就无法用浏览器浏览(Open in ...
- entityframework使用oracle的几个小问题
问题一:Operation is not valid due to the current state of the object 生成的edmx文件有问题,解决方法参考链接 问题二:InvalidO ...
- Centos6下安装Mono和Jexus部署ASP.NET应用程序(纯干货)
一.服务器 腾讯云VPS,Centos6.6系统 二.安装 1.yum升级 yum –y update 2.安装Mono所需要的库 yum -y install gcc gcc-c++ bison p ...
- 我的ORM之十-- MyOql实现原理
我的ORM索引 ORM的功能 两个基本功能 翻译:对象查询转化为SQL 映射:把查询结果转化为实体 更多功能 如果仅仅实现这两个功能,那这两个是可以独立的,实现起来也就很简单了.但MyOql的目标还有 ...
- 【C语言学习】《C Primer Plus》第9章 函数
学习总结 1.函数有利于我们可以省去重复的代码,函数可以使程序更加模块化,从而有利于程序的阅读.修改和完善.我们在系统设计或架构设计的时候,往往追求的是模块化.组件化.松耦合,而函数就是其代码的表现. ...