今天修改同事代码的时候,发现数据无规律排序,但搜索语句里确实有order by,跟踪的过程中发现,数据处理过程中使用了HashSet来去除List数据中的冗余,然后返回新的List,此时就会出现排序混乱问题。搜了一下,原来HashSet保存数据的时候是无序的,导致返回的新的List也是无序的,所以每次查询得到的结果顺序都不一样。

初始代码:

public static void removeDuplicate(List<T> oldList){

Set<T> set = new HashSet<T>(oldList);

oldList.clear();

oldList.add(set);

}

第一次修改后:

public static void removeDuplicate(List<T> oldList){

Set<T> set = new HashSet<T>();

List<T> list = new ArrayList<T>();

for(T t : oldList){

if(!set.contains(t) )

set.add(t);

else

 list.add(t);

}

oldList.removeAll(list);

}

以为大功告成了,一测试,发现少了很多数据,无奈继续debug,原来oldList.removeAll(list);这里出了问题。removeAll()不是吧oldList中的list移除,而是移除包含在list中的数据,所以,能返回数据就是大幸,极端情况就是一条数据都返回不了。

先看一下removeAll的源码:

public boolean removeAll(Collection<?> c) {

 boolean modified = false;

Iterator<?> it = iterator();

while (it.hasNext()) {

 if (c.contains(it.next())) {

it.remove();

  modified = true;

 }

 }

return modified;

 }

继续修改:

public static List<T> removeDuplicate(List<T> oldList){

Set<T> set = new HashSet<T>();

List<T> list = new ArrayList<T>();

for(T t : oldList){

if(!set.contains(t))  {

set.add(t);

list.add(t);

}

}

return list;

}

这样返回的结果才正确了。


发表评论