1. /**    
  2.  * 以句比文,比较语句重复比例    
  3.  * @author: slzs    
  4.  * Dec 21, 2012 3:13:57 PM    
  5.  * @param source 源数据    
  6.  * @param compareStr 比较数据    
  7.  * @param mark 是否标记    
  8.  * @param separatorArray 分离符,注意特殊字符的转义,如{ '.', '?' }    
  9.  * @return Object[] [0]语句重复占自身总句比例 [1]标记源内容 (mark==true时)[2]标记比较内容 (mark==true时)    
  10.  * each engineer has a duty to keep the code elegant    
  11.  */ 
  12. public static Object[] compareForSentence(String source, String compareStr, boolean mark, char... separatorArray) {    
  13.        
  14.     // 语句重复比例    
  15.     float sameRate = 0;    
  16.        
  17.     if (!StringUtil.isEmptyTrim(source) && !StringUtil.isEmptyTrim(compareStr)) {    
  18.         // 拆句子    
  19.         List<String> sentenceArray;    
  20.         if (separatorArray != null && separatorArray.length > 0) {    
  21.             sentenceArray = separator(compareStr, true, separatorArray);    
  22.         } else {    
  23.             sentenceArray = separator(compareStr, true' '' ''、'','',''.''。''?''?''!''!');    
  24.         }    
  25.         if (sentenceArray != null) {    
  26.        
  27.             // 总句数    
  28.             int sumCount = sentenceArray.size();    
  29.             if (sumCount > 0) {    
  30.          
  31.                 // 找到相同句数    
  32.                 int sameCount = 0;    
  33.                 // 是否连续    
  34.                 boolean continuation = false;    
  35.                 // 多样式    
  36.                 int styleIndex = 0;    
  37.                 String className = "same_sentence";    
  38.                 for (String sentence : sentenceArray) {    
  39.                     if (source.indexOf(sentence) > -1) {    
  40.                         // 找到相同    
  41.                         sameCount++;    
  42.                         if (mark) {    
  43.                             // 标记源字符串中相同语句    
  44.                             source = source.replace(sentence, "<span class=\"" + className + "_" + styleIndex + "\">" + sentence + "</span>");    
  45.                             // 标记比较字符串中相同语句    
  46.                             compareStr = compareStr.replace(sentence, "<span class=\"" + className + "_" + styleIndex + "\">" + sentence + "</span>");    
  47.        
  48.                             if (!continuation) {    
  49.                                 // 非连续相同,5个样式区分标记,连续相同则用相同样式    
  50.                                 styleIndex = styleIndex < 5 ? ++styleIndex : 0;    
  51.                             }    
  52.        
  53.                         }    
  54.                         continuation = true;    
  55.                     } else {    
  56.                         continuation = false;    
  57.                     }    
  58.                 }    
  59.                 // 计算比例    
  60.                 sameRate = sameCount / (float) sumCount;    
  61.             }    
  62.         }    
  63.     }    
  64.        
  65.     return new Object[] { sameRate, source, compareStr };    
  66. }    
  67.        
  68. /**    
  69.  * 字符串拆分器    
  70.  * @author: slzs    
  71.  * Dec 21, 2012 3:26:55 PM    
  72.  * @param sourceStr 待拆分源字符串    
  73.  * @param noRepeat 是否去重    
  74.  * @param separatorArray 分离符,以每个字符进行分割    
  75.  * @return List<String> 拆出的语句集    
  76.  * each engineer has a duty to keep the code elegant    
  77.  */ 
  78. public static List<String> separator(String sourceStr, boolean noRepeat, char... separatorArray) {    
  79.        
  80.     List<String> strList = null;    
  81.        
  82.     if (separatorArray != null && separatorArray.length > 0 && !StringUtil.isEmptyTrim(sourceStr)) {    
  83.         // 拼接分离符号    
  84.         String separatorStr = "";    
  85.         for (char joinChar : separatorArray) {    
  86.             separatorStr += joinChar;    
  87.         }    
  88.         // 拆分临时字符串数组    
  89.         String[] splitArrayTemp = sourceStr.split("[" + separatorStr + "]");    
  90.         if (splitArrayTemp != null && splitArrayTemp.length > 0) {    
  91.             strList = new ArrayList<String>();    
  92.             // 存储拆分信息    
  93.             for (String str : splitArrayTemp) {    
  94.                 // 排除重复语句    
  95.                 if (!StringUtil.isEmptyTrim(str) && (!noRepeat || !strList.contains(str))) {    
  96.                     strList.add(str);    
  97.                 }    
  98.             }    
  99.         }    
  100.        
  101.     }    
  102.        
  103.     return strList;