package com.bimoku.util.filter;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.springframework.stereotype.Component;
/**
* 字段取优算法filter
*
* 1:规定不同站点权重【如:当当:0.2,京东:0.1,亚马逊:0.2,豆瓣0.5】 2:算出每个站点该字段的结果 3:统计,得分高的字段被定位最后的结果
*
* @author Lee
*
*/
public abstract class FieldFilter {
/**
* 来自不同站点的同一字段,选取最优的结果
*
* 1、相似度判断,把所有站点字段相似度达到一定数值的时候,认为是同一排序结果 a:根据相似度分组【相似度超过0.5的记录分为一组,称谓一个结果集】
* b:根据不同的结果集,结合权重,得出最终结果 2、根据不通站点的权重值,做计算。 3、权重值高的,对应的结果作为最终结果返回
*
* @param map
* : key:站点 value:字段字符串
* @return
*/
public String netFilter(Map<String, String> map) {
String result = "";
return result;
}
/**
* 同一个网页页面范围内,根据不同区域内出现同一字段内容,选取最优内容
*
*
*
* @param map
* @return
*/
public String pageFilter(Map<String, String> map) {
String result = "";
return result;
}
/**
* 一则数据的处理,如:
* 《朱镕基上海讲话实录(平装):再现朱镕基总理主政上海期间的重要讲话、谈话、信件等106篇,首次公开珍贵照片和手迹影印件!》《朱镕基上海讲话实录
* 》编辑组 编_简介_书评_在线阅读-当当图书 将其处理为:朱镕基上海讲话实录
*
* @param field
* @return
*/
protected abstract String fieldPriority(String field);
//public
/**
* 找出多个字符串中匹配最长的字符串。
*
* @param list
* @return
*/
public static String longestMatch(String[] arr) {
for(int i = 1; i < arr.length; i++){
arr[i] = longestMatch(arr[i-1], arr[i]);
}
return arr[arr.length - 1];
}
/**
* 找出两个字符串中匹配最长的字符串。
* @update 2013-8-27
* !!!!!!当两个字段进来,一个字段唯恐或者为空时,而另一字段不空时,取不空字段!!!!!!
* @param fields
* @return
*/
private static String longestMatch(String str1, String str2) {
if((str1==null||str1.equals("")) && str2!=null && !str2.equals("")){
return str2;
}
if((str2==null||str2.equals("")) && str1!=null && !str1.equals("")){
return str1;
}
// 使用最短的字符串去分割,可以实现效率更优。
String bigStr = str1.length() > str2.length() ? str1 : str2;
String smaStr = str1.length() > str2.length() ? str2 : str1;
String maxStr = "";
// 对短的字符串先进行逐个分割。
for (int i = 0; i < smaStr.length(); i++) {
String temp = smaStr.substring(i, i + 1);
if (bigStr.indexOf(temp) != -1) {// 如果第一个字符匹配上,则开始往后匹配。
String temTest = smaStr.substring(i, smaStr.length());
if (maxStr.length() < temp.length())
maxStr = temp;
int k = 1;
while (k < temTest.length()) {
k++;
String strT = temTest.substring(0, k);
// 如果出现匹配不上了,说明增加最后一个字符之后就匹配不上了,那么增加最后一个之前都还能匹配。
if (bigStr.indexOf(strT) == -1) {
String maxtemp = strT.substring(0, k - 1);
if (maxStr.length() < maxtemp.length())
maxStr = maxtemp;
break;
} else if (k == temTest.length()) {
/*
* 如果匹配到最后没有字符串了还是能匹配上,说明从开始进入循环到最后一个字符都能匹配。
* 其实在这里还可以优化一下程序。就是程序匹配到最后一个字符串了,那么外层的for循环就没必要再做了。
*/
if (bigStr.indexOf(temTest) != -1) {
if (maxStr.length() < temTest.length())
maxStr = temTest;
}
}
}
}
}
return maxStr;
}
/**
* 得到纯净的字符串,去除:标点,空格等
* @param inp
* @return
*/
private static String pureStr(String inp){
return "";
}
/**
* 去掉<>之间的部分
* @param content
* @return
*/
public static String trimTag(String content) {
String regEx = "<[^>]+>";
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(content.trim());
String result = "";
if (m.find()) {
result = m.replaceAll("");
}
result = result.replace("<", "").replace(">", "");
return result;
}
public static void main(String[] args) {
String[] arr = {
"朱镕基上海讲话实录(平装):再现朱镕基总理主政上海期间的重要讲话、谈话、信件等106篇,首次公开珍贵照片和手迹影印件",
"朱镕基上海讲话实录(平装):再现朱镕基总理主政上海期间的重要讲话、谈话、",
"《朱镕基上海讲话实录》编辑组 编,人民出版社,9787010124025"};
String[] arr2 = {
"dongcai当当网图书[csaacascacbaksbcakcabkcica好熟啊 啊]",
null
};
System.out.println(longestMatch(arr2));
//String[] arr = {"好声音,中国","中国好声音","中国,好声音"};
//System.out.println(longestMatch(arr));
System.out.println(trimTag(" <aaaaaaa> aa>".trim()));
}
}