本周的工作中遇到了一个集合去重的问题,现拿到两个储存着id的list,而我需要获得这个两个list中不重复的id,于是我就想当然的写下了如下的代码。
public static void difference(){
List<long> lista = new ArrayList<>();
List<long> listb = new ArrayList<>();
List<long> ids = new ArrayList<>();
for(long ida : lista){
for(long idb : listb){
if(ida != idb){
ids.add(ida);
}
}
}
}
…………..老实说写完了之后我再也不好意思说我是java工程师了。这里面的问题简直大了去了,亏我还能写出着玩意。
首先,这个方法没有先到去重问题,是重复的id没有处理。其次,这段代码根本就没有完成获得非重复代码的功能,它只是把第二个集合里的参数和第一个里的参数一个一个单独进行比较,获取获得的不相同的数据,然后要再将所有重复的参数全部去掉才是正确结果,所以,正确的画风应该以下这样的。
//首先将这段比较的代码单独抽出以增强复用性
//其次,在list里有一个查询此集合中是否有某个参数的方法,无需我们循环另一个集合
public static List<long> getDiffList(List<long> firstList, List<long> secondList){
/*我们光判断了集合,但毕竟list是从别的地方区出来的,有没有还不知道呢,所以这里要先做一下判断,看看
这个集合是否是空的*/
if(firstList == null || fisrstList.size() == 0){//这里也可以写成公共代码方便使用
return Lists.newArrayList();//如果这个list为空,那么就返回一个空的集合
}
if(secondList == null || secondList.size() == 0){
return firstList;//需要比较的都是空的了,那还比啥呢,直接返回吧
}
List<long> ids = new ArrayList<>();//或者有谷歌包下的Lists,newArrayList()
for(long id : firstList){//老样子,取出第一个list的id
if(!secondList.contains(id)){//然后使用contains方法将id和第二个数组里的全部参数比较
ids.add(item);//如果不存在则添加进返回的list
}
}
reture ids;
}
只要注意几点其实这个方法就出来了。首先,去重问题,拿到的id要保证唯一性。其次,是将第一个集合中的参数和第二个集合中所有的参数都比较一遍后,不存在再添加进不相同的集合,而不是将第二个集合拆开后一个一个比较。
由此看来,本人的java水平还处在刚刚入门的阶段,需要自己再努力去提高它,而不是单纯的拿着前辈们写好的方法去用,用完了就完了。