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

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

最新文章

  1. BranchCache在sharepoint2013使用
  2. 如果你的SharePoint出现了,状态服务问题,InfoPath无法正常使用
  3. office2016各个版本 以及 解决visio搜索任何都提示无匹配项问题
  4. SpringMVC学习--入门程序
  5. ListView.DragEnter触发不了
  6. 在服务器端将现有Git项目导入GitLab
  7. virtualbox 打不开ubuntu解决
  8. VS2008 调试记录
  9. svn IP地址变更后如何变更
  10. python 核心编程第六章课后题自己做的答案
  11. 设计模式--装饰者设计模式(Decorator)
  12. OO_第二单元总结
  13. hibernate 调用存储过程返回参数
  14. Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)-A-Single Wildcard Pattern Matching
  15. InfluxDB源码目录结构解析
  16. (asp)JScript读写、复制、移动文件 asp也就那回事(4)
  17. iOS8 之后 tableview separatorInset cell分割线左对齐,ios7的方法失效了
  18. Google Admob广告Android全攻略1
  19. TRUNCATE TABLE 与 DELETE的区别
  20. 解决非controller使用,@Autowired或者@Resource注解注入Mapper接口为null的问题

热门文章

  1. [UE4]Animation Techniques used in Paragon部分翻译及索引
  2. 数据库表中存在Text类型的属性时,写sql语句时需要注意喽!
  3. 编译系统中BNF: Backus-Naur Form
  4. VC CComboBox用法总结
  5. Web应用数据库配置参数读取方法之一
  6. Spring声明式事务管理基于@Transactional注解
  7. 中国大学MOOC-陈越、何钦铭-数据结构-2016秋期末考试
  8. CSharpGL(40)一种极其简单的半透明渲染方法
  9. C++ REST SDK的基本用法
  10. node(md5)