|
|
由于list是有顺序的,允许重复记录的,但是实际应用中很多时候要求我们必须去掉重复,特别是一些javaBean,采用循环比较,这样要运算list.size()*list.size()次,巧妙的利用list.contain(Object obj),和obj.equals(Object obj);方法可以使去重运算较少到list.size()次
原理是这样的:
list.contains(o),系统会对list中的每个元素e调用o.equals(e),方法,加入list中有n个元素,那么会调用n次o.equals(e),只要有一次o.equals(e)返回了true,那么list.contains(o)返回true,否则返回false。
很显然,只要我们重写javaBean的equals(Object obj)方法就可以实现简单的利用contains()方法返回true,false来确定是否去掉;
还有一种方法是利用list.sort的排序,实现一个Comparator,对list进行排序,后根据排序结果遍历,让javaBean和上一个javaBean进行比较,相同的弃掉而实现去重
不知道我说的清不清楚,下面贴出一个contains(),equals(),排重的例子:
List<order> list = new ArrayList<Order>(); if(ListA!=null){ Iterator it= ListA.iterator(); while(it.hasNext()){ list.add((Order)it.next()); } } if(ListB!=null){ Iterator it= ListB.iterator(); while(it.hasNext()){ Order o=(Order)it.next(); if(!list.contains(o)) list.add(o); } }public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; final Order other = (Order) obj; if(this.getOrderid()!=other.getOrderid()) return false; return true; }import java.util.Arrays;import java.util.List;import java.util.LinkedList;public class tests { public static List printMap1(String[] s) { List<String> list = new LinkedList<String>(); List<String> list2 = Arrays.asList(s); list.addAll(list2); return list; } public static String[] array_unique(String[] a) { // array_unique List<String> list = new LinkedList<String>(); for(int i = 0; i < a.length; i++) { if(!list.contains(a[i])) { list.add(a[i]); } } return (String[])list.toArray(new String[list.size()]); } public static void main(String[] args) { String[] ar = {"dd","cc","ee","ff","gg","cc","ee"}; String[] s = array_unique(ar); for(String aa : s) { System.out.println(aa); } System.out.println("--------------linkedList:"); List list3 = printMap1(ar); for(Object o : list3) { System.out.println(o); } } } |
|