实现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 字符串加密技术应对策略 今天来 ...
随机推荐
- (01背包 排序+特判)饭卡(hdu 2546)
http://acm.hdu.edu.cn/showproblem.php?pid=2546 Problem Description 电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额 ...
- windows编程:资源和播放声音
要播放声音,要附加项:winmm.lib,然后包含头文件:#include <mmsystem.h> 播放声音用PlaySound函数,只能播放midi和wav波形文件. #define ...
- selenium 切换窗口 每次成功code
最近用了网络上别人的一段切换窗口的code每次成功了,不错,学习 // 根据Title切换新窗口 public boolean switchToWindow_Title(WebDriver drive ...
- IDEA 创建Maven Web项目(图文版)
前言:IDEA作为一款广泛使用的开发工具,无论是后台人员,还是前段工作者,都能在它上面发现它的魅力. IDEA提供了诸多项目模板,今天就以创建Maven Web项目作为示例,和大家一起分享: 第一步: ...
- cmd输出的日志里有中文乱码的解决办法
在命令行使用adb logcat命令直接输出日志中文内容显示乱码,原因是中文系统中cmd命令行窗口默认的编码是GBK,而LogCat打印的日志是UTF-8编码,所以adb logcat命令输出的中文内 ...
- art虚拟机启动问题分析
欢迎转载opendevkit文章, 文章原始地址: http://www.opendevkit.com/?e=69 Attempt to invoke native method in non-sta ...
- Swift不同storyboard之间的交互
如何实现多个Storyboard之间的切换 正如大家所知道的,Main-board是·程序运行的入口,如果找不到就会抛出异常,打开plist文件可以看到关于Main-board的描述,特别的制定了其b ...
- 蛙蛙推荐:AngularJS学习笔记
为了降低前端代码的数量,提高可维护性,可测试性,学习了下AngularJS,正在准备投入项目开发中. AngularJS的概念比较多,如果面向对象方面的书理解的不透的话学习起来有些费劲,它的官方有个快 ...
- Anciroid的IPC机制-Binder概述
在Linux系统中,是以进程为单位分配和管理资源的.出于保护机制,一个进程不能直接访问另一个进程的资源,也就是说,进程之间互相封闭.但是,在一个复杂的应用系统中,通常会使用多个相关的进程来共同完成一项 ...
- await之后的线程问题
之前看了园子里的一篇文章「async & await的前世今生」,收益颇多.而其中有句话被博主特意用红色标注,所以留意多看了几眼,「await 之后不会开启新的线程(await 从来不会开启新 ...