不多废话,以说起去重复,大部分人直接想到的就是遍历,比较……从来不考虑程序效率问题,下面把几种常用的比较好理解的去重复的处理方式记录一下,
从简单到难:
1、最简单的,List<String> 这种形式,如果List.size =n 的话,用遍历的方式,循环次数决定了效率。
最垃圾的算法
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("1");
list.add("s");
list.add("b");
list.add("1");
list.add("c");
for(int i = 0;i<list.size();i++){
for(int j= 0;j<list.size();j++){
if(list.get(i).equals(list.get(j))){//发现一箱的,但是i不能等于j,否则就是他自己
if(i!=j){
System.out.println("重复"+list.get(i));
}
}
}
}
}
使用这种方法,循环n*n次,如何处理一下大幅度减少循环的次数呢?
public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("1"); list.add("s"); list.add("b"); list.add("1"); list.add("c"); List<String> list2 = new ArrayList<String>(); for(int i = 0;i<list.size();i++){ if(list2.contains(list.get(i))){ System.out.println("重复"+list.get(i)); } list2.add(list.get(i)); } }
区别就是多new了一个List,每次判断,如果List里面有,那就是重复的,此时循环次数就剧减,而且list.contains方法的效率要比实际知己遍历list高
然而这两种方法都太Low了,能不能更少循环,更少代码,当然可以。下面我们复习一下list,set,map的区别 都是集合,set不可重复,map键不可重复
根据这个特性,我想直接去重复怎么办?
public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("1"); list.add("s"); list.add("b"); list.add("1"); list.add("c"); Set<String> set = new HashSet<String>(); set.addAll(list); list.clear(); list.addAll(set); }
这回你发现了……天啊,不需要写遍历代码了,代码上不用体现循环了。当然用map一样可以做到
好了你说List<String> 太简单了,里面如果是一个复杂对象该咋办,一样可以处理。
假设我们有一个
Point 对象,里面有x,y等属性,但是我们认为,当x和x一样的话,这就是同一个点,怎么办?
首先重写
Point对象的equls方法
public class Point{ //懒得写代码了,暂时用这个代替,这是说明当x,y一样的时候这个点唯一 private int x; private int y; public Point(int x, int y){ this.x = x; this.y = y; } public boolean equals(Object o){ if(!(o instanceof Point)) return false; Point p = (Point)o; return p.x == x && p.y == y; } }
接下来没错,继续把这个List<Point> 放到set里面……