需求是对List
中的Object
中某些字段相同的进行去重,这里可以利用Set
和Comparator
进行比较后去重
package com.liying.banana.user;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import com.liying.banana.order.vo.OrderVO;
/**
* List集合中的对象按照某个字段去重实现
*
* @author jqlin
*
*/
public class DuplicateOrderTest {
public static void main(String[] args) {
List<OrderVO> orderList = new ArrayList<OrderVO>();
OrderVO orderVO = new OrderVO();
orderVO.setOrderNo("11");
orderVO.setUserId("aa");
orderList.add(orderVO);
orderVO = new OrderVO();
orderVO.setOrderNo("22");
orderVO.setUserId("bb");
orderList.add(orderVO);
orderVO = new OrderVO();
orderVO.setOrderNo("33");
orderVO.setUserId("aa");
orderList.add(orderVO);
List<OrderVO> dataList = removeDuplicateOrder(orderList);
for(OrderVO data : dataList){
System.out.println(data.getOrderNo() + ":" + data.getUserId());
}
}
/**
* 去重
*
* @param orderList
* @return
* @author jqlin
*/
private static List<OrderVO> removeDuplicateOrder(List<OrderVO> orderList) {
Set<OrderVO> set = new TreeSet<OrderVO>(new Comparator<OrderVO>() {
@Override
public int compare(OrderVO a, OrderVO b) {
// 字符串则按照asicc码升序排列
//多个字段的话可以拼接一下后比较两个字符串
//String key1 = "aaa" + "bbb";
//String key2 = "bbb" + "ccc";
//按照这个key值升序升序
//return key1.compareTo(key2)
return a.getUserId().compareTo(b.getUserId());
}
});
//这里要注意当orderList集合大小只有1的时候其实没必要去重,就一个元素还去啥重
//注意点2,虽然比较器中 = 0的会被判定相同,但是Set在去重的时候会按照 orderList 中元素的顺序来去重,可能最后拿到的不是你想要的结果,这里要慎重.比如说我们想要 orderList 去重后 quantity最大的那个元素,但是orderList中 quantity 最小的元素排在第一位,那么后面再根据 自定义的compare比较的时候会把后面我们要的quantity最大的那个元素丢弃掉
//建议只用于去重,不要同时去重和修改数据
set.addAll(orderList);
return new ArrayList<OrderVO>(set);
}
}
执行结果:
11:aa
22:bb