JAVA中去重复的几个典型的方法

不多废话,以说起去重复,大部分人直接想到的就是遍历,比较……从来不考虑程序效率问题,下面把几种常用的比较好理解的去重复的处理方式记录一下,

从简单到难:

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里面……




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值