Java实现数组去除重复数据的方法详解

 更新时间:2017年09月07日 10:14:18   作者:海岸线-haianxian  
这篇文章主要介绍了Java实现数组去除重复数据的方法,结合实例形式详细分析了java数组去除重复的几种常用方法、实现原理与相关注意事项,需要的朋友可以参考下

本文实例讲述了Java实现数组去除重复数据的方法。分享给大家供大家参考,具体如下:

前一段时间被面试问到:如果一个数组中有重复元素,用什么方法可以去重?一时间会想到用一种方法,但是后来查阅资料后发现,有好多方法可以实现,现在就总结一下,比较简单的几种。

一.用List集合实现

int[] str = {5, 6, 6, 6, 8, 8, 7,4};
List<Integer> list = new ArrayList<Integer>();
for (int i=0; i<str.length; i++) {
  if(!list.contains(str[i])) {
    list.add(str[i]);
  }
}
System.out.println("去除重复后的list集合"+list);

输出结果是:

去除重复后的list集合[5, 6, 8, 7, 4]

可以看到可以去除重复的元素,但是没有实现排序功能。

二.用hashSet或者TreeSet实现

Integer[] nums = { 5, 5, 6, 6, 6, 8, 8, 7, 11, 12, 12 };
// HashSet hset = new HashSet(Arrays.asList(nums));
TreeSet<Integer> hset = new TreeSet<Integer>(Arrays.asList(nums));
Iterator i = hset.iterator();
while(i.hasNext()){
  System.out.println(i.next());
}

输出结果:

5 6 7 8 11 12

可以看到不仅去除了重复数据,而且将数据进行了排序。

其中Arrays.asList()是将一个数组转化为一个List对象,这个方法会返回一个ArrayList类型的对象, 这个ArrayList类并非java.util.ArrayList类,而是Arrays类的静态内部类!

TreeSet不仅可以使元素不重复,而且可以实现排序等功能的集合,它在对象元素添加到集合中时会自动按照某种比较规则将其插入到有序的对象序列中。

三.用List和set实现

int[] nums = { 5, 6, 6, 6, 8, 8, 7 };
List<Integer> numList = new ArrayList<Integer>();
for (int i : nums)
  numList.add(i);
Set<Integer> numSet = new HashSet<Integer>();
numSet.addAll(numList);
System.out.println(numSet);

输出结果:

[5, 6, 7, 8]

可以看出,也是去掉重复的数据,并且实现了排序。

我们来做一个HashSet和TreeSet的比较:

HashSet

HashSet有以下特点

1) 不能保证元素的排列顺序,顺序有可能发生变化
2) 不是同步的
3) 集合元素可以是null,但只能放入一个null

当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据 hashCode值来决定该对象在HashSet中存储位置。

简单的说,HashSet集合判断两个元素相等的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode()方法返回值相等

注意,如果要把一个对象放入HashSet中,重写该对象对应类的equals方法,也应该重写其hashCode()方法。其规则是如果两个对 象通过equals方法比较返回true时,其hashCode也应该相同。另外,对象中用作equals比较标准的属性,都应该用来计算 hashCode的值。

TreeSet类

TreeSet是SortedSet接口的唯一实现类,TreeSet可以确保集合元素处于排序状态。TreeSet支持两种排序方式,自然排序 和定制排序,其中自然排序为默认的排序方式。向TreeSet中加入的应该是同一个类的对象。

TreeSet判断两个对象不相等的方式是两个对象通过equals方法返回false,或者通过CompareTo方法比较没有返回0

自然排序

自然排序使用要排序元素的CompareTo(Object obj)方法来比较元素之间大小关系,然后将元素按照升序排列。

Java提供了一个Comparable接口,该接口里定义了一个compareTo(Object obj)方法,该方法返回一个整数值,实现了该接口的对象就可以比较大小。

obj1.compareTo(obj2)方法如果返回0,则说明被比较的两个对象相等,如果返回一个正数,则表明obj1大于obj2,如果是 负数,则表明obj1小于obj2。

如果我们将两个对象的equals方法总是返回true,则这两个对象的compareTo方法返回应该返回0

定制排序

自然排序是根据集合元素的大小,以升序排列,如果要定制排序,应该使用Comparator接口,实现 int compare(T o1,T o2)方法。

最重要:

1、TreeSet 是二差树实现的,Treeset中的数据是自动排好序的,不允许放入null值。

2、HashSet 是哈希表实现的,HashSet中的数据是无序的,可以放入null,但只能放入一个null,两者中的值都不能重复,就如数据库中唯一约束。

3、HashSet要求放入的对象必须实现HashCode()方法,放入的对象,是以hashcode码作为标识的,而具有相同内容的 String对象,hashcode是一样,所以放入的内容不能重复。但是同一个类的对象可以放入不同的实例 。

PS:本站还有两款比较简单实用的在线文本去重复工具,推荐给大家使用:

在线去除重复项工具:
http://tools.jb51.net/code/quchong

在线文本去重复工具:
http://tools.jb51.net/aideddesign/txt_quchong

更多关于java相关内容感兴趣的读者可查看本站专题:《Java数组操作技巧总结》、《Java字符与字符串操作技巧总结》、《Java数学运算技巧总结》、《Java数据结构与算法教程》及《Java操作DOM节点技巧总结

希望本文所述对大家java程序设计有所帮助。

相关文章

  • 关于Spring AOP使用时的一些问题汇总

    关于Spring AOP使用时的一些问题汇总

    这篇文章主要给大家汇总介绍了关于Spring AOP使用时的一些问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Java注解Annotation原理及自定义注解代码实例

    Java注解Annotation原理及自定义注解代码实例

    这篇文章主要介绍了Java注解Annotation原理及自定义注解代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • maven项目下solr和spring的整合配置详解

    maven项目下solr和spring的整合配置详解

    这篇文章主要介绍了maven项目下solr和spring的整合配置详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • 你真的了解java单例模式了吗?

    你真的了解java单例模式了吗?

    这篇文章主要介绍了你真的了解java单例模式了吗?实际上单例模式有着好几个变种,并且多线程中涉及到线程安全问题,,需要的朋友可以参考下
    2019-06-06
  • 基于Map的computeIfAbsent的使用场景和使用方式

    基于Map的computeIfAbsent的使用场景和使用方式

    这篇文章主要介绍了基于Map的computeIfAbsent的使用场景和使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • JAVA 中Spring的@Async用法总结

    JAVA 中Spring的@Async用法总结

    这篇文章主要介绍了JAVA 中Spring的@Async用法总结的相关资料,需要的朋友可以参考下
    2017-03-03
  • 详解Java多线程与并发

    详解Java多线程与并发

    多线程是一个进程在执行过程中产生多个更小的程序单元,这些更小的单元称为线程,这些线程可以同时存在,同时运行,一个进程可能包含多个同时执行的线程。多线程是实现并发机制的一种有效手段。进程和线程一样,都是实现并发的一个基本单位。
    2021-06-06
  • Java编程实现的模拟行星运动示例

    Java编程实现的模拟行星运动示例

    这篇文章主要介绍了Java编程实现的模拟行星运动,涉及java基于swing组建绘制动态效果及数值运算相关操作技巧,并总结分析了java面向对象的相关特性,需要的朋友可以参考下
    2018-04-04
  • 基于ThreadPoolTaskExecutor的使用说明

    基于ThreadPoolTaskExecutor的使用说明

    这篇文章主要介绍了基于ThreadPoolTaskExecutor的使用说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • 详解Spring Cloud Feign 熔断配置的一些小坑

    详解Spring Cloud Feign 熔断配置的一些小坑

    这篇文章主要介绍了详解Spring Cloud Feign 熔断配置的一些小坑,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04

最新评论