面试编程题3:元素去重

       编程第三题:元素去重。基本上集中在数组或者List去重。前面我们介绍了两个数组合并,一般来说,合并后可能存在重复的元素,所以,我们还需要实现把重复的元素给去掉。Java常见的元素去重有4到5中,基本上都是用上了集合的知识。因为数组是没有添加和删除元素的方法,但是集合类一般都有。看来很多面试编程的题目,范围都集中在Java的集合框架方面,也就是经常说的数据结构和算法的范畴。

1. 普通数组嵌套循环实现

package test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class StringContaisTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		String[] A = {"a","dc","a","56","ab","a","56","ba","NBA","b"};
		
		//新建一个list,用来存储不重复的元素
		List<String> list1 = new ArrayList<String>();
		
		//嵌套循环,判断数组A相邻两个元素是否相等
		for(int i=0; i<A.length; i++){
			
			//第二层循环,从i+1范围开始
			for(int j=i+1; j<A.length; j++){
				
				if(A[i] == A[j]){
					j = ++i;
				}
			}
			list1.add(A[i]);
		}
		
		System.out.println(list1.toString());
		
	}

}

运行结果:

[dc, ab, a, 56, ba, NBA, b]

       这个方法是实现了元素去重,但是没有保留之前元素的排序位置。而且,嵌套循环,性能不好,关键是读代码,读起来费劲,费脑子。

2.利用List实现

       接下来这个方法,代码和逻辑看起来更清晰,方便他人读懂,也很好记住这段代码。原理就是,先创建一个空的list集合,然后拿空的list去和数组元素没一个进行对比,如果发现list里不包含的元素,那么就把这个元素丢进list。

package test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class StringContaisTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		String[] A = {"a","dc","a","56","ab","a","56","ba","NBA","b"};
		
		//新建一个list,用来存储不重复的元素
		List<String> list1 = new ArrayList<String>();
		
		for(int i=0; i<A.length; i++){
			
			if(!list1.contains(A[i])){
				// 把不包含的元素添加进List
				list1.add(A[i]);
				
			}
		}
		
		System.out.println(list1.toString());
		
	}

}

运行结果

[a, dc, 56, ab, ba, NBA, b]
       这个方法逻辑和思路清晰,而且输出结果可以最大保留原数组元素的相对位置关系。如果有保留位置关系的需求,这个方法更适合。

3.TreeSet或者HashSet实现

这里TreeSet元素支持自动排序并去重输出,直接来看代码。

package test;

import java.util.TreeSet;

public class StringContaisTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		String[] A = {"a","dc","a","56","ab","a","56","ba","NBA","b"};
		
		//创建一个treeset对象
		TreeSet<String> ts = new TreeSet<String>();
		
		for(int i=0; i<A.length; i++){
			ts.add(A[i]);
		}
		
		System.out.println(ts);
	}

}

运行结果:

[56, NBA, a, ab, b, ba, dc]

       可以看到,我们在代码中实际上把原数组A的全部元素都添加到了TreeSet中,但是输出确实去重并排序,这个就是TreeSet的特点。HashSet也有类似效果。

package test;

import java.util.HashSet;

public class StringContaisTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		String[] A = {"a","dc","a","56","ab","a","56","ba","NBA","b"};
		
		//创建一个Hashset对象
		HashSet<String> hs = new HashSet<String>();
		
		for(int i=0; i<A.length; i++){
			hs.add(A[i]);
		}
		
		System.out.println(hs);
	}

}

运行结果:

[a, 56, ab, b, NBA, dc, ba]

       这里看到HashSet和TreeSet都实现了去重,但是打印出来的排序效果不同。所以,这里顺便记住下HashSet和TreeSet的区别。区别就是:TreeSet 是二差树实现的,Treeset中的数据是自动排好序的,不允许放入null值。HashSet 是哈希表实现的,HashSet中的数据是无序的,可以放入null,但只能放入一个null,两者中的值都不能重复,就如数据库中唯一约束。


4.List和Set实现

       第一步,把数组元素全部添加到List集合中,但是这个时候相当于拷贝,元素没有去重,所以,还需要借助Set的特点来去重。具体代码如下。

package test;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class StringContaisTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		String[] A = {"a","dc","a","56","ab","a","56","ba","NBA","b"};
		
		//新建一个ArrayList对象
		List<String> list1 = new ArrayList<String>();
		
		for(String i : A){
			
			list1.add(i);
		}
		
		//前面步骤实现了把元素添加到arraylist,但是没有去重复,所以,需要引入set
		Set<String> set1 = new HashSet<String>();
		//把list1集合元素全部添加到set1对象中
		set1.addAll(list1);
		System.out.println(set1.toString());
	}

}

运行结果:

[a, 56, ab, b, NBA, dc, ba]

       所以,数组元素去重掌握了,List元素去重也是一样道理。先把list元素添加到一个ArrayList对象,然后利用set对象的addall方法把arrarylist的元素添加到hashset,然后打印出来,自然就去重后的元素。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值