最近遇到这个问题也是头疼了很久。
按照大家思都不想思考的方法来说。
用几个for循环来解决
List<T> arr = new ArrayList<T>();
Set<Integer> idlist = new HashSet<Integer>();
int size = idlist.size();
for( T item : data){ //data为原数组
//操作
idlist.add(item.getid());
if(arr.size()>0){
if(idlist.size()>size){
size = idlist.size();
for(int i = 0;i<arr.size();i++){
if(item.getid() == arr.get(i).getid()){
arr.get(i).getList().add(item)
break;
}
}
}
}else{
size = idlist.size();
arr.add(item)
}
}
这真的是脑子都不用动的写的方法。。一开始没问题,结果抛过来的数据直接几千条,完了,这效率,真的底下到不可能呢。
于是,怎么办呢?冥思苦想的我。又换了个方法。用map表来做吧。
Map<String,List<T>> map = new HashMap<>();
for(T item:data){
if(map.get(T.getid())==null){
map.put(item)
}else{
map.get(T.getid()).add(item)
}
}
好像是没什么问题。
数据一大,运行以后。血崩。这内存吃的。。。emmmmm
凉啊。怎么搞呢。
这串数据最少肯定是要循环一遍的,而我们怎么才能吧这个数据限定在只循环一遍呢?
为什么不用数据库的排序‘order by’来解决一下呢,非要在java上死那么久。
那么,重要思路出现了,order by 来对几个属性进行升序或者降序,那么这串数据的处理的时候,我们每一条数据只需要和上一条对比,如果相同,则添加,不同,就变成新的数据插入。
for(T item:data){
if(arr.size==0){
arr.add(item)
continue;
}
if(arr.get(arr.size()-1).getid()==item.getid()){
arr.get(arr.size()-1).getlist().add(item)
continue;
}
list.add(item);
}