A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© cczheng 中级黑马   /  2014-11-21 16:51  /  1370 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

例如:原始数组是{4,2,4,6,1,2,4,7,8},得到结果{4,2,6,1,7,8}
private static void method() {
                int[] arr ={4,2,4,6,1,2,4,7,8};
                //实例化set集合对象,泛型限定为integer
                Set<Integer> set = new HashSet<Integer>();
                //取出数组中的进行判断
                for (int i = 0; i < arr.length; i++) {
                        //如果set不包含当前元素,则把该数添加到set集合中
                        if (!set.contains(arr[i])) {
                                set.add(arr[i]);
                        }
                }
                //调用toArray方法将set集合转换为数组
                Object[] newArr = set.toArray();
                //调用Arrays工具类的toString方法转换为字符串打印数组中元素
                System.out.println("原始数组是"+Arrays.toString(arr));
                System.out.println("得到结果是"+Arrays.toString(newArr));
        }

能达到要求,但是得到的结果是这样的
原始数组是[4, 2, 4, 6, 1, 2, 4, 7, 8]
得到结果是[1, 2, 4, 6, 7, 8]

为什么去掉了重复元素后,新的数组被排序了?不知道在那里被排序了,set集合的toArray()方法不具有排序功能

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 好帖!

查看全部评分

9 个回复

倒序浏览
hashset是无无序的   他存入后元素的顺序是根据存入对象的哈希值进行排列的,而Integers对象的哈希值算出来后刚好与值的大小有关。所以变成数组后就相当于被排序了~~  不知楼主是否同意呢

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 赞一个!

查看全部评分

回复 使用道具 举报
wf111sxwf 发表于 2014-11-21 17:05
hashset是无无序的   他存入后元素的顺序是根据存入对象的哈希值进行排列的,而Integers对象的哈希值算出来 ...

貌似是这么一回事,用TreeSet得到的结果也是一样
回复 使用道具 举报
cczheng 发表于 2014-11-21 17:07
貌似是这么一回事,用TreeSet得到的结果也是一样

treeset  也是需要比较的  而Integer 对象的compareto 方法  你可以查查API  必然也是 根据它的值来算出来了 所以  你懂的
回复 使用道具 举报
DamonZh 来自手机 中级黑马 2014-11-21 17:19:43
报纸
添加之前不用判断集合中是否包含指定元素吧?set集合不是自动去重吗?

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 赞一个!

查看全部评分

回复 使用道具 举报
DamonZh 发表于 2014-11-21 17:19
添加之前不用判断集合中是否包含指定元素吧?set集合不是自动去重吗?

哎呀 你这个提醒了我啊,用set的话直接添就可以了  ,好想法
回复 使用道具 举报
冥夜 中级黑马 2014-11-21 18:11:58
7#
本帖最后由 冥夜 于 2014-11-21 18:16 编辑

set集合内部有自己的排序规则,所以需要特定的排序规则就要重新定义一下。可以用treeset集合然后实现Comparable接口,然后覆盖compareTo方法为return 1- -

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 赞一个!

查看全部评分

回复 使用道具 举报
其实HashSet集合中实现的接口并没有排序的接口:Serializable, Cloneable, Iterable<E>, Collection<E>, Set<E>

其实往hashSet中放入元素,首先要通过hash算法进行计算内存地址值,计算的地址值跟元素本身大小有关。而取出数据的时候,应该根据地址值进行顺序取出,所以取出元素时有一种顺序

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

回复 使用道具 举报
DamonZh 中级黑马 2014-11-21 21:50:31
9#
zhangyangLengen 发表于 2014-11-21 20:01
其实HashSet集合中实现的接口并没有排序的接口:Serializable, Cloneable, Iterable, Collection, Set

其 ...

恩,是哈希值的顺序。今天往HashSet里存Integer对象的时候,怎么存进去的就怎么给取出来了。看了源码后发现Integer的哈希值就是包装的int值
回复 使用道具 举报
  1. public class Demo1{
  2.         public static void main(String[] args){
  3.                 int [] arr={1,2,3,1,4,2};
  4.                 printArr(arr);
  5.                 int num=deleteRepeat(arr);
  6.                 for(int i=0;i<num;i++){
  7.                         System.out.print(arr[i]+" ");
  8.                 }
  9.                
  10.         }
  11.         public static void printArr(int [] a){
  12.                 for(int i=0;i<a.length;i++)
  13.                         System.out.print(a[i]+" ");
  14.                 System.out.println();
  15.                
  16.         }
  17.         public static  int deleteRepeat(int [] a){
  18.                 int count=0;
  19.                 boolean flag;
  20.                 for(int i=0;i<a.length;i++){
  21.                         flag=true;
  22.                         for(int j=0;j<count;j++){
  23.                                 if(a[i]==a[j]){
  24.                                         flag=false;
  25.                                 }
  26.                         }
  27.                         if(flag==true){
  28.                                 a[count++]=a[i];
  29.                         }
  30.                 }
  31.                 return count;
  32.                
  33.         }
  34.                                
  35. }
复制代码

我用结构编程解决了 还没学到集合

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马