实现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 字符串加密技术应对策略 今天来 ...
随机推荐
- WebBench源码分析与心得
源码:https://github.com/EZLippi/WebBench 关键全局变量: speed 成功次数 failed 失败次数 bytes 接收字节数 benchtime 执行时长(秒 ...
- 1.iOS直播ijkplayer(第一周)
准备工作: 1.使用的B站的开源框架ijkplayer ,下载地址: https://github.com/Bilibili/ijkplayer ijkplayer 是一个基于 ffplay 的轻量级 ...
- iOS开发零基础--Swift篇 循环
循环的介绍 在开发中经常会需要循环 常见的循环有:for/while/do while. 这里我们只介绍for/while,因为for/while最常见 for循环的写法 最常规写法 // 传统写法 ...
- 带回调函数的js运动框架
function startMove(obj, json, endFun) { //开始前关闭之前obj上的定时器 clearInterval(obj.timer); //定时器 obj.timer ...
- mavan 命令行创建项目
1)创建简单maven项目 mvn archetype:create -DgroupId=cn.everlook.myweb -DartifactId=myweb -DpackageName=cn.e ...
- SSH框架的简单示例(执行流程)
本文转自一篇博文,感觉通俗易懂,适用于初学j2ee者,与大家一起分享 (一)struts框架部分 1.打开Myeclipse,创建一个web project,项目名称为TestSSH. 2.在web的 ...
- spark on centos6.5 安装
第一步在centos 6.5上安装java 运行环境 http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-18 ...
- 记录HttpWebRequest辅助类
最近因为工作关系,需要通过HttpWebRequest去请求API,所有就写了个简单的辅助public sealed class HttpRequestHelper { private static ...
- 大数据存储:MongoDB实战指南——常见问题解答
锁粒度与并发性能怎么样? 数据库的读写并发性能与锁的粒度息息相关,不管是读操作还是写操作开始运行时,都会请求相应的锁资源,如果请求不到,操作就会被阻塞.读操作请求的是读锁,能够与其它读操作共享,但是当 ...
- Ubuntu iptables配置
sudo su sudo apt-get install iptables-persistent modprobe ip_tables #启动iptable #删除原有iptables规则 ipt ...