package com.util;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.IdentityHashMap;
import java.util.List;
import java.util.Set;
import org.apache.commons.text.similarity.LevenshteinDistance;
import org.apache.commons.text.similarity.SimilarityScore;
import org.apache.commons.text.similarity.SimilarityScoreFrom;
/**
* 车牌模糊匹配
*
* @author libaibai
* @version 1.0 2019年5月24日
*/
public class PlateMatch {
/**
*
* @param target 目标车牌
* @param plateNums 车牌集合,set集合不允许重复
* @param size 返回条数
* @return
*/
public static List<String> match(String target, Set<String> plateNums, int size) {
if (target == null || target.length() < 2 || plateNums == null || plateNums.isEmpty()) {
return null;
}
// 匹配算法 0 顺序匹配 1无序Levenshtein
SimilarityScore<Integer> similarityScore = null;
// similarityScore = new HammingDistance();
similarityScore = new LevenshteinDistance();
SimilarityScoreFrom<Integer> similarityScoreFrom = new SimilarityScoreFrom<Integer>(similarityScore, target);
// 可以重复key的map
IdentityHashMap<String, String> map = new IdentityHashMap<String, String>();
for (String plateNum : plateNums) {
if (plateNum == null || plateNum.length() < 2)
continue;
// 不匹配的位数
int distance = similarityScoreFrom.apply(plateNum);
// 匹配度
if (distance <= 4) {
// plate = plateNum;
map.put("" + distance, plateNum);
}
}
Object[] key_arr = map.keySet().toArray();
Arrays.sort(key_arr);
List<String> relist = new ArrayList<String>();
if (size > key_arr.length) {
size = key_arr.length;
}
for (int i = 0; i < size; i++) {
String value = (String) map.get(key_arr[i]);
relist.add(value);
}
return relist;
}
// public static void main(String[] args) {
// Set<String> str = new HashSet<String>();
// str.add("a22aaa");
// str.add("aaaaaa");
// str.add("baaabb");
// str.add("cccccc");
// str.add("dddddd");
// str.add("eeeeee");
// str.add("ffffff");
//
// String target = "a2aaa";
// System.out.println(PlateMatch.match(target, str, 9));
// }
}
模糊查询(无序/有序匹配),并返回条数
于 2020-10-15 13:50:52 首次发布
关键词由CSDN通过智能技术生成