数组去重
Java数组去重
一、用List集合实现
1 package com.test; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 /* 7 * 数组去重 8 */ 9 public class Distinct { 10 public static void main(String[] args) { 11 int[] str ={1,5,6,9,5,6,3,5,7}; 12 List<Integer>list = new ArrayList<Integer>(); 13 for (int i = 0; i < str.length; i++) { 14 if(!list.contains(str[i])){ 15 list.add(str[i]); 16 } 17 } 18 19 System.out.println(list.toString()); 20 } 21 }
上述代码可以实现去除重复的元素,但是没有实现排序功能
二、用hashSet或者TreeSet实现
1 Integer[] nums = { 5, 5, 6, 6, 6, 8, 8, 7, 11, 12, 12 }; 2 // HashSet hset = new HashSet(Arrays.asList(nums)); 3 TreeSet<Integer> hset = new TreeSet<Integer>(Arrays.asList(nums)); 4 Iterator i = hset.iterator(); 5 while(i.hasNext()){ 6 System.out.println(i.next()); 7 }
输出结果:5 6 7 8 11 12
可以看到不仅去除了重复的数据,而且将数据进行了排序
其中Arrays.asList()是将一个数组转换为一个list对象,这个方法会返回一个ArrayList类型的对象,这个ArrayList类并非Java.util.ArrayList类,而是Arrays类的静态内部类。
TreeSet不仅可以使元素不重复,而且可以实现排序等功能的集合,他在对象元素添加到集合中时会自动按照某种比较规则将其插入到有序的对象序列中。
hashSet与treeSet比较
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方法比较
自然排序
自然排序使用要排序元素的CompareTo(Object obj)方法来比较元素之间大小关系,然后将元素按照升序排列
Java提供了一个Comparable接口,该接口里定义了一个compareTo(Object obj)方法,该方法返回一个整数值,实现了该接口的对象就可以比较大小。
自然排序是根据集合元素的大小,以升序排列,如果要定制排序,应该使用Comparator接口,实现compare(T o1,T o2)方法
最重要:
1.TreeSet是二叉树实现的,TreeSet中的数据时自动排好序的,不允许放入null值
2.hashSet是哈希表实现的,hashSet中的数据是无序的,可以放入null,但只能放入一个null,两者值都不能重复,就如数据库中的唯一约束
3.hashSet要求放入的对象必须实现hashCode方法,放入的对象,是以hashCode码作为标识的,而具有相同内容的string对象,hashCode是一样,所以放入的内容不能重复。但是同一个类可以放入不同的实例。