黑马程序员技术交流社区

标题: 数组去重复,例如: 原始数组是{4,2,4,6,1,2,4,7,8},得到结果{4... [打印本页]

作者: mnxnm    时间: 2015-5-29 11:05
标题: 数组去重复,例如: 原始数组是{4,2,4,6,1,2,4,7,8},得到结果{4...
本帖最后由 mnxnm 于 2015-5-31 10:25 编辑
  1. package itheima;

  2. /**
  3. *
  4. * 数组去重复,例如: 原始数组是{4,2,4,6,1,2,4,7,8},得到结果{4,2,6,1,7,8}
  5. *
  6. * @author sman@mnxnm.com
  7. *
  8. */
  9. public class Test5 {
  10.         public static void main(String[] args) {
  11.         // 数组去重复后,元素顺序没有改变,所以不能排序不能用冒泡法

  12.         int[] a = { 4, 2, 4, 6, 1, 2, 4, 7, 8 };
  13.         if (a.length > 1) { // 如果元素个数不足2个,直接打印结果

  14.             // 依次取出元素与并与右面的元素比较
  15.             for (int i = 0; i < (a.length - 1); i++) {
  16.                 for (int j = (i + 1); j < a.length;) {
  17.                     if ( a[i] == a[j]) {

  18.                         // 去除右面与左面重复的元素,并重新定义数组长度和元素内容
  19.                        int[] b = new int[a.length - 1];
  20.                        System.arraycopy(a, 0, b, 0, j);
  21.                        System.arraycopy(a, j + 1, b, j, b.length - j);
  22.                        a = b;
  23.                        
  24.                     } else {
  25.                         j++; // 数组重新定以后,下标不变,元素变成新的;当新元素与左面不重复时,才比较下一个元素
  26.                     }
  27.                 }
  28.             }
  29.         }
  30.                     //打印新数组
  31.                    System.out.println(Arrays.toString(a));
  32.         }
  33.     }
  34. }
复制代码


作者: mnxnm    时间: 2015-5-29 11:06
这么做,有没有问题
作者: 天涯111    时间: 2015-5-29 11:14
感觉是没问题      
不过我感觉把数组放到set里面(set的值不会重复)就可以去重了   这样 会简单点   关于set端口怎么用可以在网上搜搜
作者: 天涯111    时间: 2015-5-29 11:27
本帖最后由 天涯111 于 2015-5-29 11:37 编辑

你的代码中有个小错误    if (a== a[j])


作者: 天涯111    时间: 2015-5-29 11:31
本帖最后由 天涯111 于 2015-5-29 11:38 编辑

那个a怎么保存之后就变a了     你的代码是对的
                    
              

作者: yogkin    时间: 2015-5-29 15:20
可能是我能力问题,我看你的代码好吃力,下面是我的实现代码,自我感觉良好,你看看如何。

  1. package com.heima;

  2. import java.util.Arrays;

  3. /**
  4. * 5、 数组去重复,例如: 原始数组是{4,2,4,6,1,2,4,7,8},得到结果{4,2,6,1,7,8}
  5. * @author czm
  6. *
  7. */
  8. public class ClearElemnt {
  9.         public static void main(String[] args) {
  10.                 int[] arr = {4,2,4,6,1,2,4,7,8};
  11.                
  12.                 //获取数组中元素的重复个数
  13.                 int repickNum = getRepickNum(arr);
  14.                
  15.                 int[] newArr = new int[arr.length-repickNum];
  16.                
  17.                 //对新数组进行赋值,如果新元素中没有这个元素则添加进去,如果已经存在,则不添加
  18.                 copyArr(arr, newArr);
  19.                
  20.                 //打印新数组
  21.                 System.out.println(Arrays.toString(newArr));
  22.                
  23.         }

  24.         private static void copyArr(int[] arr, int[] newArr) {
  25.                 // TODO Auto-generated method stub
  26.                 //定义新数组的下标,用于自增
  27.                 int index = 0;
  28.                 for (int i = 0; i < arr.length; i++) {
  29.                         //用于判断新数组中是否已经存在这个元素,默认是不存在的。
  30.                         boolean flag = false;
  31.                         for (int j = 0; j < newArr.length; j++) {
  32.                                 if (arr[i]==newArr[j]) {
  33.                                         flag = true;
  34.                                         break;
  35.                                 }
  36.                         }
  37.                         if (!flag) {
  38.                                 newArr[index] = arr[i];
  39.                                 index++;
  40.                         }
  41.                 }
  42.         }

  43.         private static int getRepickNum(int[] arr) {
  44.                 int repickNum = 0;
  45.                 //简单的排序算法
  46.                 for (int i = 0; i < arr.length-1; i++) {
  47.                         for (int j = i+1; j < arr.length; j++) {
  48.                                 //如果在比较中,发现有相同的元素则repickNum+1,继续执行下一次循环。
  49.                                 if (arr[i]==arr[j]) {
  50.                                         repickNum++;
  51.                                         break;
  52.                                 }
  53.                         }
  54.                 }
  55.                 return repickNum;
  56.         }

  57. }
复制代码


作者: forTomorrow    时间: 2015-5-29 16:39
直接新建一个list集合,对原数组中的元素依次判断,如果不包含则添加,言外之意就是重复元素不会添加进去
作者: edithe    时间: 2015-5-29 17:25
  1. class Test
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int[]  oldArr =  {1,4,9,4,1,1,7};
  6.                 int[] newArr = clearRepeat(oldArr);
  7.                 System.out.println("清除重复元素的数组:"+ Arrays.toString(newArr));
  8.         }


  9.         public static int[] clearRepeat(int[] oldArr){
  10.                 int count = 0 ; //count变量 是用于记录重复元素的个数

  11.                 //计算出重复元素的个数
  12.                 for(int i  = 0 ; i<oldArr.length -1  ; i++ ){
  13.                         for(int j = i+1 ; j<oldArr.length ; j++){
  14.                                 if(oldArr[i]==oldArr[j]){
  15.                                         count++;
  16.                                         break;
  17.                                 }
  18.                         }
  19.                 }
  20.                
  21.                 //创建一个新的数组
  22.                 int[] newArr = new int[oldArr.length-count];
  23.                
  24.                
  25.                 int index = 0;        //新数组使用的索引值。

  26.                 //遍历旧数组
  27.                 for(int i = 0 ; i<oldArr.length ; i++){
  28.                         boolean flag = false; //该标识是用于标识取出的元素是否存在新数组中。 false默认情况是不存在 的。

  29.                         int temp = oldArr[i];        //从旧数组 中取出遍历的元素
  30.                         //遍历新的数组是否存在该数据
  31.                         for(int j = 0 ; j<newArr.length ; j++){
  32.                                 if(newArr[j]==temp){
  33.                                         flag = true;
  34.                                         break;
  35.                                 }       
  36.                         }

  37.                         //该元素不存在新数组中,这时候应该存储起来
  38.                         if(flag==false){
  39.                                 newArr[index++] = temp;
  40.                         }
  41.                 }

  42.                 return newArr;
  43.         }
  44. }
复制代码

作者: mnxnm    时间: 2015-5-29 17:38
天涯111 发表于 2015-5-29 11:31
那个a怎么保存之后就变a了     你的代码是对的
                    
              

嗯,是的,我是以纯文字发表的,点击"代码"后,在代码框里提交就好了
作者: 志行    时间: 2015-5-29 17:42
视频里面我记得有   是搞了一个方法   该方法传入一个ArrayList  然后在方法里面在建立一个ArrayList   对传入的进行遍历 同时判断 新建的集合中是否包含遍历出来的元素 包含就pass  不包含就添加 最后输出新的集合   这是视频上的去除重复方法  额  受限 数组变集合  最后集合变数组~~~~
作者: mnxnm    时间: 2015-5-29 17:42
天涯111 发表于 2015-5-29 11:14
感觉是没问题      
不过我感觉把数组放到set里面(set的值不会重复)就可以去重了   这样 会简单点   关于 ...

set是乱序的,用set去重后,元素的顺序会发生改变,所以没用set
作者: mnxnm    时间: 2015-5-29 18:03
yogkin 发表于 2015-5-29 15:20
可能是我能力问题,我看你的代码好吃力,下面是我的实现代码,自我感觉良好,你看看如何。

嗯,你的方法不错,
我们两个的思路刚好相反,
我的是逐个剔除重复元素
你的是逐个增加新元素,已经存在的就不添加
:lol
作者: mnxnm    时间: 2015-5-29 18:06
志行 发表于 2015-5-29 17:42
视频里面我记得有   是搞了一个方法   该方法传入一个ArrayList  然后在方法里面在建立一个ArrayList   对 ...

是的,大多数人都是这么做的,引入了list集合,
集合变数组,数组变集合
我这个就是两个for循环,没有引入第三种对象进来
作者: mnxnm    时间: 2015-5-29 18:26

你和"地板"那一楼的,你们两个一样滴:lol
作者: zhousuo28    时间: 2015-5-29 20:46
我用的是集合,因为数组定长不确定重复的有多少个所以感觉还是集合好
作者: Melo    时间: 2015-5-29 21:29
我用的集合做的
作者: zhou330667146    时间: 2015-5-29 23:40
新人报道,正在努力
作者: LoveMyself    时间: 2015-5-30 00:48
真心受教了
作者: 天涯111    时间: 2015-5-30 09:45
人多力量大啊,讨论中学到的东西更多。大家多发表一下个人思路  分享一下。
作者: 天涯111    时间: 2015-5-30 09:49
mnxnm 发表于 2015-5-29 17:42
set是乱序的,用set去重后,元素的顺序会发生改变,所以没用set

哦,大家想的不同   我想的就是简单点   能实现题目要求就行:)
作者: 天涯111    时间: 2015-5-30 09:50
mnxnm 发表于 2015-5-29 17:38
嗯,是的,我是以纯文字发表的,点击"代码"后,在代码框里提交就好了

好吧    这个以前不知道啊,下次知道了,谢谢。
作者: mnxnm    时间: 2015-5-30 10:37
天涯111 发表于 2015-5-30 09:45
人多力量大啊,讨论中学到的东西更多。大家多发表一下个人思路  分享一下。 ...

人多力量大,咱们组团吧:lol
作者: 汗血宝马    时间: 2015-5-30 12:27
真的很好,长见识啦!:handshake
作者: zhangniuren    时间: 2015-5-30 15:13
不错不错,收藏了
作者: 天涯111    时间: 2015-6-1 15:20
mnxnm 发表于 2015-5-30 10:37
人多力量大,咱们组团吧

可以啊,大家一起努力    组团战斗
作者: 林以    时间: 2015-12-8 20:52
受教了  又学到了新东西
作者: liuruhui    时间: 2015-12-8 21:48
6666666666666666666666666666666666666666666666666
作者: hyl    时间: 2015-12-8 22:03
去除数组的中的重复元素,要多次比较判断。for嵌套循环。
作者: 臭小子    时间: 2015-12-8 22:08
太给力   拷贝下来好好研究
作者: 会走路的二百块    时间: 2015-12-8 22:16
遍历数组,直接用LinkedhashSet()集合不就可以了?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2