起因:還是動態生成圖表時的問題,因為欄位是動態設定的,可以在多個軸、序列中設置欄位,這就很有可能會存在欄位的重複問題.重複的欄位生成Sql並執行是沒有問題的,但執行的結果,生成List(執行Hibernate的sqlquery.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP).list())時就會有問題了(拋出異常).就要除去查詢sql欄位中的重複欄位.
想到的是把字元串分隔成數組,再添加到set中,再用Set中的欄位名重新生成不重複的欄位名字元串.
代碼是這樣的:
[java]
String s = "D_NAME,COMPANYID,COMPANY_NAME,PARENT_ID,ID,COMPANYID,COMPANY_NAME,DF_UNIFIED_CODE,DF_CLEARANCE_TAG_ID,";
String[] s1 = s.split(",");
Set set = new HashSet();
for(String ss : s1){
set.add(ss);
}
Iterator iter = set.iterator();
String newStr = "";
while(iter.hasNext()){
newStr = iter.next();
}
結果顯示,重複的欄位並沒有去掉.
把set.add(ss);改為
[java]
if(!set.contains(ss))
set.add(ss);
結果依舊.
我不知道java是集合是怎麼處理字元串的.請教java老手,說理論上Set中應該是不會重複的,但對出現這樣的結果,也沒有有效的解決辦法.哪位大蝦能告訴我這是怎麼回事呀?
然後我就想到使用正則表達式來實現除去字元串的重複欄位名.
第一個表達式:
(\b[\w|_] \b,?)(.*)\1(.*),代碼為:
[java]
String s = "LOWVOLTAGE_LOSS_RATE,YEARMONTH,LOWVOLTAGE_LOSS_RATE,NAME,YEarmONTH,PPQ,PPQ,SPQ,PPQ,PPQ,SPQ,CODE,LOWVOLTAGE_LOSS_RATE";
Pattern p = Pattern.compile("(\\b[\\w|_] \\b,?)(.*)\\1(.*)");
Matcher matcher = p.matcher(s);
while(matcher.find()){
s = matcher.replaceAll("$1$2$3");
System.out.println(s);
matcher = p.matcher(s);
}
if(s.endsWith(","))
s = s.substring(0,s.length()-1);
String expect = "LOWVOLTAGE_LOSS_RATE,YEarmONTH,NAME,PPQ,SPQ,CODE";
Assert.assertEquals(expect, s.substring(0,s.length()-1));
驗證結果為預期結果.
本來以為到這裡就已經結束了,可系統剛運行了一會,就報出了錯誤,跟蹤發現,當要處理的字元串為:
"D_NAME,COMPANYID,COMPANY_NAME,PARENT_ID,ID,COMPANYID,COMPANY_NAME,DF_UNIFIED_CODE,DF_CLEARANCE_TAG_ID,"時,執行的結果會把"DF_CLEARANCE_TAG_ID"替換成"DF_CLEARANCE_TAG_",這可不是我要的結果!
經改進后的正則表達式為:(\b[\w|_] \b,?)(.*)\b\1\b (.*),再次測試,結果完全滿足要求.
[火星人 ] 正則表達式實現除去重複的單詞已經有542次圍觀