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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 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. }
复制代码

点评

谢谢,谢谢兄弟,,这是我邮箱 sman@mnxnm.com ,以后有问题直接电邮我 ,只要我会的,一定帮你!  发表于 2015-5-30 15:33
很给力,刚好老师出了这个题,要求不用set和list,谢谢!貌似这个论坛什么都要分,兄弟我的分全给你,  发表于 2015-5-30 15:17
你好,加我好友,好吗,我申请过了  发表于 2015-5-30 12:26
大哥,有QQ吗,加我,我们详聊  发表于 2015-5-30 12:18

评分

参与人数 2黑马币 +52 收起 理由
zhangniuren + 31 很给力,刚好老师出了这个题,要求不用set.
汗血宝马 + 21 很给力!

查看全部评分

33 个回复

倒序浏览
这么做,有没有问题
回复 使用道具 举报
感觉是没问题      
不过我感觉把数组放到set里面(set的值不会重复)就可以去重了   这样 会简单点   关于set端口怎么用可以在网上搜搜
回复 使用道具 举报
本帖最后由 天涯111 于 2015-5-29 11:37 编辑

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

回复 使用道具 举报
本帖最后由 天涯111 于 2015-5-29 11:38 编辑

那个a怎么保存之后就变a了     你的代码是对的
                    
              
回复 使用道具 举报
可能是我能力问题,我看你的代码好吃力,下面是我的实现代码,自我感觉良好,你看看如何。

  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. }
复制代码

回复 使用道具 举报
直接新建一个list集合,对原数组中的元素依次判断,如果不包含则添加,言外之意就是重复元素不会添加进去
回复 使用道具 举报
edithe 中级黑马 2015-5-29 17:25:12
8#
  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:57
9#
天涯111 发表于 2015-5-29 11:31
那个a怎么保存之后就变a了     你的代码是对的
                    
              

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

set是乱序的,用set去重后,元素的顺序会发生改变,所以没用set
回复 使用道具 举报
mnxnm 中级黑马 2015-5-29 18:03:00
12#
yogkin 发表于 2015-5-29 15:20
可能是我能力问题,我看你的代码好吃力,下面是我的实现代码,自我感觉良好,你看看如何。

嗯,你的方法不错,
我们两个的思路刚好相反,
我的是逐个剔除重复元素
你的是逐个增加新元素,已经存在的就不添加
:lol
回复 使用道具 举报
mnxnm 中级黑马 2015-5-29 18:06:51
13#
志行 发表于 2015-5-29 17:42
视频里面我记得有   是搞了一个方法   该方法传入一个ArrayList  然后在方法里面在建立一个ArrayList   对 ...

是的,大多数人都是这么做的,引入了list集合,
集合变数组,数组变集合
我这个就是两个for循环,没有引入第三种对象进来
回复 使用道具 举报
mnxnm 中级黑马 2015-5-29 18:26:53
14#

你和"地板"那一楼的,你们两个一样滴:lol
回复 使用道具 举报
我用的是集合,因为数组定长不确定重复的有多少个所以感觉还是集合好
回复 使用道具 举报
Melo 中级黑马 2015-5-29 21:29:33
16#
我用的集合做的
回复 使用道具 举报
新人报道,正在努力
回复 使用道具 举报
真心受教了
回复 使用道具 举报
人多力量大啊,讨论中学到的东西更多。大家多发表一下个人思路  分享一下。
回复 使用道具 举报
mnxnm 发表于 2015-5-29 17:42
set是乱序的,用set去重后,元素的顺序会发生改变,所以没用set

哦,大家想的不同   我想的就是简单点   能实现题目要求就行:)
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马