黑马程序员技术交流社区

标题: 去除数组重复元素,大家帮看下问题出在哪了?? [打印本页]

作者: 布鲁图斯    时间: 2014-8-17 12:09
标题: 去除数组重复元素,大家帮看下问题出在哪了??
本帖最后由 布鲁图斯 于 2014-8-17 12:11 编辑

数组是引用数据类型,函数调用时参数是地址传递的,为什么最终结果没有变化呢?
  1. package com.itheima;

  2. /**
  3. * 5、 数组去重复,
  4. * 例如: 原始数组是{4,2,4,6,1,2,4,7,8},得到结果{4,2,6,1,7,8}
  5. *
  6. * @author Administrator
  7. */
  8. public class ArrayTest {

  9.         public static void main(String[] args)
  10.         {
  11.                 int[] arr = {4,2,4,6,1,2,4,7,8};
  12.                
  13.                 remain(arr);//去除数组中重复元素
  14.                
  15.                 printArray(arr);//[4, 2, 4, 6, 1, 2, 4, 7, 8]    ? ? why...
  16.                
  17.         }

  18.         /**
  19.          * remain()去除数组中重复元素
  20.          */
  21.         private static void remain(int[] arr)
  22.         {
  23.                 int[] temp = new int[arr.length];
  24.                
  25.                 int cnt = 0;
  26.                 for(int i=0; i<arr.length; i++)
  27.                 {
  28.                         if(!isExist(temp, arr[i]))
  29.                                 temp[cnt++] = arr[i];
  30.                 }
  31.                
  32.                 int[] result =new int[cnt];
  33.                 for(int i=0; i<cnt; i++)
  34.                 {
  35.                         result[i] = temp[i];
  36.                 }
  37.                
  38.                 arr = result;
  39.                
  40.                 //printArray(arr); //[4, 2, 6, 1, 7, 8]
  41.         }
  42.        
  43.         private static boolean isExist(int[] arr, int num)
  44.         {
  45.                 for(int i=0; i<arr.length; i++)
  46.                 {
  47.                         if(num == arr[i])
  48.                                 return true;
  49.                 }
  50.                 return false;
  51.         }
  52.        
  53.         private static void printArray(int[] arr)
  54.         {
  55.                 System.out.print("[");
  56.                 for(int i=0; i<arr.length; i++)
  57.                 {
  58.                         if(i != arr.length-1)
  59.                                 System.out.print(arr[i]+", ");
  60.                         else
  61.                                 System.out.println(arr[i]+"]");
  62.                 }
  63.         }

  64. }
复制代码



作者: そ花痕ゐ蝶梦    时间: 2014-8-17 13:58
当result做为返回值接收再打印,看一下。
作者: 紫水    时间: 2014-8-17 14:08
本帖最后由 紫水 于 2014-8-17 14:21 编辑

建议楼主好好的学习基。方法没有问题,void代表的是没有返回值类型。把你的输出语句放到remain方法中。或者修改remain 方法,返回一个数组。没有返回值的话,你输出的还是原来的数组。也就是说你调用方法操作数据已经把数组中的重复元素去掉。但是并没有把去重后的数组进行返回。所以你调用输出方法的时候输出的还是原来的数组。注意红色部分
  1. public class ArrayTest {

  2.         public static void main(String[] args)
  3.         {
  4.                 int[] arr = {4,2,4,6,1,2,4,7,8};
  5.                
  6.               //去除数组中重复元素
  7.                
  8. <font color="#ff0000">                printArray(remain(arr));//输出去重后的数组</font>
  9.                
  10.         }

  11.         /**
  12.          * remain()去除数组中重复元素
  13.          */
  14.         private static <font color="#ff0000">int[]</font> remain(int[] arr)<font color="#ff0000">//返回值类型为int数组</font>
  15.         {
  16.                 int[] temp = new int[arr.length];
  17.                
  18.                 int cnt = 0;
  19.                 for(int i=0; i<arr.length; i++)
  20.                 {
  21.                         if(!isExist(temp, arr[i]))
  22.                                 temp[cnt++] = arr[i];
  23.                 }
  24.                
  25.                 int[] result =new int[cnt];
  26.                 for(int i=0; i<cnt; i++)
  27.                 {
  28.                         result[i] = temp[i];
  29.                 }
  30.                
  31.                 arr = result;
  32. <font color="#ff0000">                                return result;                                  //返回值</font>
  33.                
  34.                 //printArray(arr); //[4, 2, 6, 1, 7, 8]
  35.         }
  36.         
  37.         private static boolean isExist(int[] arr, int num)
  38.         {
  39.                 for(int i=0; i<arr.length; i++)
  40.                 {
  41.                         if(num == arr[i])
  42.                                 return true;
  43.                 }
  44.                 return false;
  45.         }
  46.         
  47.         private static void printArray(int[] arr)
  48.         {
  49.                 System.out.print("[");
  50.                 for(int i=0; i<arr.length; i++)
  51.                 {
  52.                         if(i != arr.length-1)
  53.                                 System.out.print(arr[i]+", ");
  54.                         else
  55.                                 System.out.println(arr[i]+"]");
  56.                 }
  57.         }

  58. }
复制代码


作者: interface_sfly    时间: 2014-8-17 15:12
好复杂,你把数组集合元素放进集合里不就行了么。。
作者: J.twt    时间: 2014-8-17 15:30
确实,有集合,妈妈再也不用担心我去重复啦
作者: 布鲁图斯    时间: 2014-8-17 19:26
紫水 发表于 2014-8-17 14:08
建议楼主好好的学习基。方法没有问题,void代表的是没有返回值类型。把你的输出语句放到remain方法中。或者 ...

我知道,可是数组作为实参进行传递,不应该是地址传递吗?
还有,我记得对数组进行元素交换以及排序时方法不也不用定义返回值吗?
作者: 布鲁图斯    时间: 2014-8-17 19:27
J.twt 发表于 2014-8-17 15:30
确实,有集合,妈妈再也不用担心我去重复啦

不是,这是我之前写的,当时还没有学到集合那部分,今天翻出来看,就像看看问题出在了那里,
作者: caiyaoren    时间: 2014-8-17 20:56
紫水 发表于 2014-8-17 14:08
建议楼主好好的学习基。方法没有问题,void代表的是没有返回值类型。把你的输出语句放到remain方法中。或者 ...

good                  
作者: 不想飞不到    时间: 2014-8-20 19:38
你的remain都没返回值 而且你的printArray接受的参数是数组,这样编译不会出问题?系统都不知道你要打印什么
作者: 迦南    时间: 2014-8-20 21:38
public static void main(String[] args){
                int[] i = {4,2,4,6,1,2,4,7,8};
                List list = new ArrayList();
                for (int data:i) {
                        if(!list.contains(data)){
                                list.add(data);
                        }
                }
                System.out.println(list);
        }
作者: 冒牌高手    时间: 2014-8-31 08:56
你的41行代码,其实是将result的地址传递给了形参arr,并没有传递给你main函数中的arr,所以你main函数中的arr的指向根本没变,你画个内存图就搞定了。你的函数的意思是将main函数中的arr地址给了形参arr,最后形参arr的地址又被result给赋值了,所以跟你main函数中的arr是没关系的
作者: 冒牌高手    时间: 2014-8-31 10:05
并且你这个方法中有一个漏洞,如果原数组中有0的存在的话,0也会被一并清除的,最后的新数组也不会有0




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