1. 程式人生 > >關於利用HashSet,split,deleteCharAt等方法詳解

關於利用HashSet,split,deleteCharAt等方法詳解

1.首先了解一下HashSet的原理:

Set介面  Set是對數學上集的抽象,Set中不包含重複的元素.如何界定是否是重複元素?Set最多可含一個null元素;對於任意的非null元素e1和e2,都滿足e1.equals(e2)==false.  Object.hashcode()的約定:a.在程式的一次執行中,無論何時在同一個java物件上重複呼叫hashcode(),都必須一致地返回同一個整數值,並不像Object.equals()那樣提供Object是否被修改了的資訊,但這個整數值不必在同一個應用程式的多次執行之間保持一致.b.如果兩個Object通過equals()判斷是相等的,那麼,在這兩個Object上呼叫hashcode()必返回相同的值.

c.如果兩個Object通過equals()判斷是不相等的,那麼,並不要求這兩個Object.hashcode()返回不同的整數值.

Set實現  HashSet是使用一個雜湊表儲存元素的,是非排序的,可以隨機訪問,是Set的最優效能實現.TreeSet實現了SortedSet介面,使用一個紅黑樹來儲存元素,提供了元素的有序儲存和訪問.   HashSet(HashSet在底層借用HashMap)  HashSet在底層實現上依賴於HashMap.    HashSet的原始碼片斷:

// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object(); public HashSet() { map = new HashMap<E,Object>(); } public boolean add(E o) { return map.put(o, PRESENT)==null; } public boolean remove(Object o) { return map.remove(o)==PRESENT; } public boolean contains(Object o) {
return map.containsKey(o); }

從程式碼可見,HashSet在底層借用HashMap,使用一個Object型別的啞元值作為HashSet中元素在底層HashMap儲存中的對映值.它抓住了HashMap的鍵不允許重複的特性.對於add()中呼叫底層對映的put(),將欲新增的元素和一個PRESENT啞元值放入底層map.如果底層Map返回null,說明原來的集合中並不存在該鍵.對於Map介面的put()返回null時有兩種解釋,一是原來的Map中不包含該鍵;另一種可能是原來的Map中已經儲存了該健,但該鍵對映到null.而在HashSet中的add()和remove()等中的返回null只有一種解釋,即原來的集合不包含該元素.這是因為HashSet的底層的對映中儲存的都是一個名為PRESENT的Object型別的物件,不可能是null.

2.示例程式碼如下:

          UserLookupSearchCriteria criteria =(UserLookupSearchCriteria) theForm.getSearchCriteria2();
                String tempFilterUserCodes=criteria.getFilterUserCodes();//這裡指從頁面上獲取的filterUserCodes
 
                String filterUserCodes=printDlg.getFileUserCodes();//呼叫一個介面,從資料庫查詢的filterUserCodes
 
                                                             //然後現在有兩個filterUserCodes,他們的值是不同的,所以需要遍歷來獲取他們一個不重複的set集合,然後傳入後臺進行過濾。
 
                Set<String> userCodesSet=new HashSet<String>();//新建一個Hashset集合
            
                if(!StringUtil.isEmpty(tempFilterUserCodes)){
                    String[] tempUserCodesArray=tempFilterUserCodes.split(",");
                    for(String userCode:tempUserCodesArray){
                        userCodesSet.add(userCode);
                    }
                }                                                      //判斷如果tempFilterUserCodes不為空,就使用split方法轉為陣列進行遍歷,然後add到set集合中
                if(!StringUtil.isEmpty(filterUserCodes)){
                    String[] userCodesArray=filterUserCodes.split(",");
                    for(String userCode:userCodesArray){
                        userCodesSet.add(userCode);
                    }
                 }                                                   //判斷如果filterUserCodes 不為空,就使用split方法轉為陣列進行遍歷,然後add到set集合中,但是在這裡如果兩個String的值都不為空,根據set集合的特性,會過濾掉重複的值,所以得到的set集合是一個沒有重複值的集合。
                StringBuffer userCodeStr=null;
                if(userCodesSet!=null&&userCodesSet.size()>0){
                    userCodeStr=new StringBuffer();
                    for(String userCode:userCodesSet){
                        userCodeStr.append(userCode).append(",");
                    }//然後去遍歷userCodesSet集合,轉為一個String,
                    userCodeStr.deleteCharAt(userCodeStr.length()-1);
 
                                        //使用String的方法deleteCharAt 過濾掉最後一個逗號
 
                }
                criteria.setFilterUserCodes(userCodeStr==null?"":userCodeStr.toString());//拿到新的String傳入後臺
                UserLookupSearchCriteria userLookupSearchCriteria = printDlg.getUserLookupList(criteria);
                theForm.setUsers(userLookupSearchCriteria.getUsers());
                theForm.setSearchCriteria2(userLookupSearchCriteria);
                
                forwardName = "userlookupList";

note:這裡為什麼要使用這樣的過濾呢?是因為一個是從頁面上傳入過來的userCode,還有一個是從後臺讀取的userCode,而這兩個String都是需要過濾掉的,所以需要使用整合過濾。