实现List按与一个字符串的相似度和字母顺序排序(适用于模糊查询后的排序)...
因公司业务需要,自己写了一个,保存起来以后可能还会用到。如果还有更好的方法或者算法,希望大家提出来。
1、简单的相似度算法(自己想到的)
因为List中每个String都会包含一个标准的字符串,那么每个字符串除了标准字符串的左边或者右边都会有一定量的字符。相似度的定义是多出来的字符*100(只适用与在标准字符串左边最多还多出99字符的字符串,可以根据情况扩大)+标准字符串左边的字符的个数。例:标准字符串是"abc",那么字符串"abcd"与标准字符串的相似度是100,字符串"dabc"与标准字符串的相似度是101,字符串"xabcz"与标注字符串的相似度是201,字符串"xzabc"与标准字符串的相似度是202。因此这里定义的相似度最小为0,其越小就越接近标准字符串。说到这里这个就不应该就相似度、应该叫偏差度。
1 private static Integer getSemblance(String toBeComparedString, String standardString){ 2 if(StringUtils.isBlank(toBeComparedString) || StringUtils.isBlank(standardString)){ 3 LOGGER.error("出错,待比较的字符串或标注字符串为空"); 4 return null; 5 } 6 Integer diffIndex = toBeComparedString.length() - standardString.length(); 7 if(diffIndex<0){ 8 LOGGER.error("出错,待比较的字符串比标准的字符串还要短"); 9 return null; 10 } 11 Integer headDiffIndex = toBeComparedString.indexOf(standardString); 12 if(headDiffIndex<0){ 13 LOGGER.error("出错,待比较的字符串不包含标准字符串"); 14 return null; 15 } 16 return diffIndex*100+headDiffIndex; 17 }
相似度算法
2、java中快速排序的方法(可以自定义排序规则)
jave中的java.util.Comparator。Comparator<T>是一个快速排序的接口,只要写个类实现接口的排序规则的方法就行。
1 /** 2 * File Name:Sort.java 3 * Package Name:[packName] 4 * Date:2015年11月12日上午10:57:14 5 * Copyright (c) 2015年11月12日, Pwenlee All Rights Reserved. 6 * 7 */ 8 9 package com.olymtech.cs.openplatform.ds.service.impl; 10 11 import java.util.Comparator; 12 13 /** 14 * ClassName:Sort <br/> 15 * Function: 字符串compaer排序. <br/> 16 * Reason: TODO ADD REASON. <br/> 17 * Date: 2015年11月12日 上午10:57:14 <br/> 18 * @author PwenLee 19 * @version 20 * @see 21 */ 22 public class Sort implements Comparator<String> { 23 24 /** 25 * Function: 字符串排序的规则. <br/> 26 * @Date: 2015年11月12日 上午10:57:14 <br/> 27 * @author PwenLee 28 */ 29 @Override 30 public int compare(String arg0, String arg1) { 31 if(arg0.compareTo(arg1)>0){ 32 return 1; 33 }else if(arg0.compareTo(arg1)<0){ 34 return -1; 35 }else{ 36 return 0; 37 } 38 } 39 }
实现compare方法的类
1 //new后面是实现compare的类 2 Comparator<String> comparator = new Sort(); 3 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的相似度的ListList<Integer> listSemblance = new ArrayList<Integer>();if(toBeComparedStringList.size()<=0){System.out.println("出错,待比较的字符串为空");return null;}//初始化相似度的Listfor(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中对应的Stringfor(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
转载于:https://www.cnblogs.com/pwenlee/p/4958898.html
实现List按与一个字符串的相似度和字母顺序排序(适用于模糊查询后的排序)...相关推荐
- 实现输入一个字符串,分别将大写字母、小写字母、数字、其他字符存到列表里面并且输出列表
1.实现输入一个字符串,分别将大写字母.小写字母.数字.其他字符存到列表里面并且输出列表 capital = [] lowercase = [] number = [] character = [] ...
- c语言学习-对从键盘输入的一个字符串中的大英字母及数字进行计数
对从键盘输入的一个字符串中的大英字母及数字进行计数 程序流程图: 代码: #include<stdio.h> void main() {char ch[10]; int i=0,j=0; ...
- Java中判断一个字符串全为数字和字母
1.使用字符和整数转换 //判断一个字符串中是否全为字母 public static boolean isAllLetters(String str) {char[] chars=str.toChar ...
- 【20】输入一个字符串,统计其中的字母、数字、其他字符的个数。
在[16]中其实已经写了相关代码,当时用的是getchar()函数.由于getchar()函数的应用:单字符输入函数.就总总感觉怪怪的 后来写了一篇输入输出总结,就觉得用gets岂不是更方便嘛.这篇其 ...
- 统计元音字母——输入一个字符串,统计处其中元音字母的数量。更复杂点的话统计出每个元音字母的数量。
/*** 统计元音字母--输入一个字符串,统计处其中元音字母的数量.* 更复杂点的话统计出每个元音字母的数量.* @author cscss**/ public class CountYuanYin ...
- python实训三 编写函数,接收一个字符串,分别统计大写字母,小写字母,数字,其他字符的个数,并以元组的形式返回结果
编写函数,接收一个字符串,分别统计大写字母,小写字母,数字,其他字符的个数,并以元组的形式返回结果 源码: intcount=[] upstrcount=[] lowstrcount=[] other ...
- 输入一个字符串,将其中大写字母转换为对应小写字母之后的第五个字母,若原始大写字母为V~Z, 则转换为对应小写字母的值减21。其他字符不变,输出转换.
输入一个字符串,将其中大写字母转换为对应小写字母之后的第五个字母,若原始大写字母为V-Z, 则转换为对应小写字母的值减21.其他字符不变,输出转换. #include<stdio.h> ...
- 【Python】对一个字符串中的所有英文字母进行排序
题目 对一个字符串中的所有英文字母进行排序 栗子 字符串 a = 'hello word' 排序后结果: ['d', 'e', 'h', 'l', 'l', 'o', 'o', 'r', 'w'] c ...
- Quzh[python]统计元音字母——输入一个字符串,统计处其中元音字母的数量。
#!/usr/bin/env python # coding:utf-8def Quzh_Statistics_Vowel(strString):"""统计元音字母--输 ...
最新文章
- pytorch nn.LSTM()参数详解
- Python 算术运算符
- VS Code上也能玩转Jupyter Notebook,这是一份完整教程
- 使用proxy来调用未定义的属性方法
- Ubuntu 16.04编译安装OpenCV(Python)
- leetcode468. 验证IP地址
- 亲,如果你笑了,记住给我留言!
- jquery报变量没定义错误的原因
- Java多线程学习十:线程池实现“线程复用”的原理
- 代码检测vc2013环境是否已经安装了
- CSDN 写作小技巧(2)—— 如何在 CSDN 博客的文章开篇创建目录?
- 【渝粤教育】电大中专沟通技巧_1作业 题库
- ubuntu服务器版无线网卡,ubuntu server 16.10 启用无线网卡
- C/C++犯二程度计算
- win10快捷键【常用】桌面切换等快捷键
- VMware打开.vmx没反应
- Android---ADB工具连接真实手机(有线连接与无线连接)
- 如何将Excel中的表格直接转成LaTex格式?
- 微信小程序获取OneNet数据显示温湿度
- 【励志篇】我的创业历程总结