面试编程题3:元素去重

来源:互联网 发布:log4j sql日志级别 编辑:程序博客网 时间:2024/06/17 05:19

       编程第三题:元素去重。基本上集中在数组或者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 stubString[] 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 stubString[] 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])){// 把不包含的元素添加进Listlist1.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 stubString[] 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 stubString[] 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 stubString[] 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,但是没有去重复,所以,需要引入setSet<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,然后打印出来,自然就去重后的元素。

原创粉丝点击