集合操作在web應(yīng)用開發(fā)中也是很常見的骤铃,目前也有一些比較方便的工具如java.util.Collections阅嘶、org.apache.commons.collections.CollectionUtils等,但是根據(jù)自己公司項(xiàng)目開發(fā)中的具體情況提取一套更何用的集合操作工具類也是很有幫助的嚼松。
1八毯、獲取在集合A而不在集合B內(nèi)的元素(差集)
/**
* 獲取在first集合內(nèi)而不在second集合內(nèi)的元素
* @param first
* @param second
* @return
*/
public static List<String> getDiffList(Collection<String> first, Collection<String> second) {
long t = System.currentTimeMillis();
Set<String> sameString = new HashSet<String>(second);
List<String> result = new ArrayList<String>(first.size());
for (String s : first) {
if (!sameString.contains(s)) {
result.add(s);
}
}
if(System.currentTimeMillis() - t > 1){
logger.debug("getDiffList with list first.size={},sencond.size={},use time={}ms",first.size(),second.size(),System.currentTimeMillis()-t);
}
return result;
}
- 比較重要的點(diǎn)是將second集合轉(zhuǎn)換為set绢涡,因?yàn)閟et判斷是否包含一個(gè)元素時(shí)間復(fù)雜度是O(1)
2、獲得在集合A內(nèi)同時(shí)在集合B內(nèi)的元素(交集)
/**
* 獲得在list內(nèi)同時(shí)在list2內(nèi)的元素
* 注意:在結(jié)果集內(nèi)并不去重鳖轰,如果list內(nèi)本身有重復(fù)清酥,返回的結(jié)果內(nèi)可能包含相同元素
* @param list
* @param list2
* @return
*/
public static List<String> getSameElements(Collection<String> list, Collection<String> list2) {
long t = System.nanoTime();
Set<String> set = new HashSet<String>(list2);
List<String> sameElements = new ArrayList<String>(list.size());
for(String item : list){
if(set.contains(item)){
sameElements.add(item);
}
}
if(logger.isDebugEnabled()){
logger.debug("getSameElements list.size={},list2.size={},use time={}ns",list.size(),list2.size(),System.nanoTime()-t);
}
return sameElements;
}
3、將字符串轉(zhuǎn)成list
/**
* 輔助方法蕴侣,將字符串分割轉(zhuǎn)換為list
* @author yangwenkui
* @time 2017年1月10日 下午4:22:20
* @param provinceIds
* @return
*/
public static List<String> stringToList(String str,String split) {
if(StringUtils.isBlank(str)){
return Lists.newArrayList();
}
String[] arr = str.split(split);
List<String> list = new ArrayList<String>(arr.length);
for(String item : arr){
if(StringUtils.isNotBlank(item)){
list.add(item);
}
}
return list;
}
- 經(jīng)常會(huì)有將id等用逗號(hào)連接存儲(chǔ)或傳輸焰轻,然后轉(zhuǎn)成集合進(jìn)行操作的場景
4、獲取集合內(nèi)每個(gè)實(shí)體的id
/**
* 獲取集合內(nèi)每個(gè)實(shí)體的id
*/
public static <T extends Serializable> List<T> getEntityIds(Collection<? extends BaseModel<T>> items) {
List<T> ids = Lists.newArrayList();
if(CollectionUtils.isEmpty(items)){
return ids;
}
for(BaseModel<T> entity : items){
T id = entity.getId();
if(!ids.contains(id)){
ids.add(id);
}
}
return ids;
}
- BaseModel是一個(gè)接口昆雀,定義了一個(gè)getId()方法
5鹦马、根據(jù)id列表找到集合內(nèi)對(duì)應(yīng)的實(shí)體
/**
* 根據(jù)id列表找到集合內(nèi)對(duì)應(yīng)的實(shí)體
* @return
*/
public static <T extends BaseModel<String>> List<T> select(Collection<T> list,Collection<String> selects){
if(CollectionUtils.isEmpty(list) || CollectionUtils.isEmpty(selects)){
return Lists.newArrayList();
}
List<T> selectList = Lists.newArrayList();
for (String id : selects) {
for(T entity : list){
if(id.equals(entity.getId())){
selectList.add(entity);
break;
}
}
}
return selectList;
}
小結(jié)
- 求集合的交集、差集注意查找實(shí)現(xiàn)的時(shí)間復(fù)雜度忆肾,list查找時(shí)間復(fù)雜度是O(n),HashSet查找時(shí)間復(fù)雜度是O(1)菱肖,建議使用HashSet客冈。測試發(fā)現(xiàn)效率差了5倍以上(集合A(1500元素)、集合B(500元素))稳强;
- 將集合轉(zhuǎn)為字符串可以使用com.google.common.base.Joiner.on(",").join(list)實(shí)現(xiàn)场仲,將字符串轉(zhuǎn)為list可以使用上文內(nèi)的方法;
- 類似于獲取集合內(nèi)每個(gè)元素的id(getEntityIds)退疫、根據(jù)id列表找到集合內(nèi)對(duì)應(yīng)的實(shí)體(select)這樣和業(yè)務(wù)比較緊密的方法應(yīng)該也會(huì)經(jīng)常出現(xiàn)渠缕,大家可以根據(jù)自身項(xiàng)目情況,將這些模板類的代碼提取出來作為公共工具包褒繁。
完整內(nèi)容請(qǐng)參考github內(nèi)rest-base項(xiàng)目內(nèi)代碼亦鳞。
https://github.com/q7322068/rest-base