因公司业务需要,自己写了一个,保存起来以后可能还会用到。如果还有更好的方法或者算法,希望大家提出来。

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按与一个字符串的相似度和字母顺序排序(适用于模糊查询后的排序)的更多相关文章

  1. 【Django+Element UI】使用一个接口文件,搞定分页获取数据,模糊查询后分页获取数据

    1:序列化获取数据的接口设计 1:分页获取序列化数据 2:是个能传参数的接口 class Society(APIView): def post(self, request): keywords = s ...

  2. java中输出一个字符串里面的空格,字母还有数字的数目举例说明

    9.6 About string,"I am a teacher",这个字符串中有多少个字,且分别把每个字打印出来. /*本题的思路就是,当我有一个字符串,我需要一个一个字符的处理 ...

  3. shell if判断(曾经被一个字符串相等的判断纠结半小时,最后只是if后少了个空格!) 和 awk引用外部变量判断

    一.if判断 数字: $A=12 $B=15 if(("$A"<"$B")) if(("$A"=="$B")) 字 ...

  4. 对于一个字符串,请设计一个高效算法,找到第一次重复出现的字符。 给定一个字符串(不一定全为字母)A及它的长度n。请返回第一个重复出现的字符。保证字符串中有重复字符,字符串的长度小于等于500。

    // 第一种方法 // ConsoleApplication10.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include < ...

  5. java怎么实现统计一个字符串中字符出现的次数

    问题:假设字符串仅仅保护a-z 的字母,java怎么实现统计一个字符串中字符出现的次数?而且,如果压缩后的字符数不小于原始字符数,则返回. 处理逻辑:首先拆分字符串,以拆分出的字符为key,以字符出现 ...

  6. 使用mybatis开发Dao的原始方法,实现根据用户id查询一个用户信息 、根据用户名称模糊查询用户信息列表 、添加用户信息等功能

    1.需求 将下边的功能实现Dao: 根据用户id查询一个用户信息 根据用户名称模糊查询用户信息列表 添加用户信息 2. 原始Dao开发方法需要程序员编写Dao接口和Dao实现类 3.User.xml映 ...

  7. 判断一个字符串str不为空的方法

    1.str == null; 2."".equals(str); 3.str.length 4.str.isEmpty(); 注意:length是属性,一般集合类对象拥有的属性,取 ...

  8. 如何识别一个字符串是否Json格式

    前言: 距离上一篇文章,又过去一个多月了,近些时间,工作依旧很忙碌,除了管理方面的事,代码方面主要折腾三个事: 1:开发框架(一整套基于配置型的开发体系框架) 2:CYQ.Data 数据层框架(持续的 ...

  9. 字符串混淆技术应用 设计一个字符串混淆程序 可混淆.NET程序集中的字符串

    关于字符串的研究,目前已经有两篇. 原理篇:字符串混淆技术在.NET程序保护中的应用及如何解密被混淆的字符串  实践篇:字符串反混淆实战 Dotfuscator 4.9 字符串加密技术应对策略 今天来 ...

随机推荐

  1. Individual Project - Word frequency program - Multi Thread And Optimization

    作业说明详见:http://www.cnblogs.com/jiel/p/3978727.html 一.开始写代码前的规划: 1.尝试用C#来写,之前没有学过C#,所以打算先花1天的时间学习C# 2. ...

  2. nginx切割日志

    #!/bin/bash ## Nginx 日志文件所在的目录 LOGS_PATH=/usr/local/nginx/logs ## 获取昨天的 yyyy-MM-dd YESTERDAY=$(date ...

  3. asp.net中gridview的checkbox使用总结

    1.在gridview中的<column>中加入 <asp:TemplateField HeaderText="选择"> <ItemTemplate& ...

  4. Web利器---fidder使用

    fiddler工具,主要看中其三点优势:1.功能强大,其他工具有的功能它也有,其他工具没有的功能它也有,支持http,https,ftp等协议:2.完全免费,长期免费.3.所有的浏览器可以使用,所有的 ...

  5. Apache HttpAsyncClient 如何设置per request timeout

    最近做一个项目时用到HttpAsyncClient:因项目所需,要求能对一个具体的request 设置连接和读写超时:但发现在HttpAsyncClient中,只有在创建一个HttpAsyncClie ...

  6. rlwrap-0.37.tar.gz实现sqlplus上下翻页

    1.上传rlwrap-0.37.tar.gz到linux 2.解压rlwrap-0.37.tar.gz [root@node1 mnt]# tar zxvf rlwrap-0.37.tar.gz [r ...

  7. ASP.NET MVC 学习笔记(一)

    很久很久没有在博客园写过东西了,很多大虾也说过展示自己最好的地方就是有一个博客作为笔记,展示一下自己的学习和研究成果. 最近决心将公司的一款产品改用MVC的方式实现,于是乎就开始在园子里面疯狂的寻找各 ...

  8. hadoop+hive使用中遇到的问题汇总

    问题排查方式  一般的错误,查看错误输出,按照关键字google 异常错误(如namenode.datanode莫名其妙挂了):查看hadoop($HADOOP_HOME/logs)或hive日志 h ...

  9. windows系统下的第一个console程序

    窗口+r 键,输入cmd,打开一个命令行窗口 切换到你的目标目录 输入 dotnet new dotnet会自动帮你创建3个文件. NuGet.Config文件主要定义了NuGet获取nupkg包时的 ...

  10. MySQL数据丢失讨论

    原文地址:http://hatemysql.com/tag/sync_binlog/ 1.  概述 很多企业选择MySQL都会担心它的数据丢失问题,从而选择Oracle,但是其实并不十分清楚什么情况下 ...