【问题标题】:How to transfer a method from Array to ArrayList如何将方法从 Array 转移到 ArrayList
【发布时间】:2016-11-27 01:52:52
【问题描述】:

所以我想要做的是转移我的 Array 方法,这些方法反转我的数组并将另外两个合并到 ArrayLists 中。除了这两种方法之外,我已经能够使用我拥有的所有其他方法来做到这一点。我从我的反向方法中收到一个错误,指出意外的类型、必需的变量、找到的值。我不知道该怎么做才能解决它。以下是我在 Array 类中的工作方法:

/***        <<< CODE COMPLETE >>>
    * reverses the order of the elemets in the array 
    ***/
    public static void reverse(int[] a)
    {
        for (int i = 0; i < a.length/2; i++)
        {
            int reverseOrder = a[i];
            a[i] = a[a.length - 1 - i];
            a[a.length - 1 - i] = reverseOrder;
        }
    }

   /***        <<< CODE COMPLETE >>>
    * merges two sorted arrays into 1 new array, maintains the sorted order 
    ***/
    public static int[] merge(int[] a, int[] b) 
    {
        int[] merge = new int[a.length + b.length];
        int i = 0, j = 0, k = 0;

        while (i < a.length && j < b.length)
        {
            if (a[i] < b[j])
            {
                merge[k++] = a[i++];
            }

            else        
            {
                merge[k++] = b[j++];
            }
        }

        while (i < a.length)
        {
            merge[k++] = a[i++];
        }


        while (j < b.length)  
        {
            merge[k++] = b[j++];
        }

        return merge;
    }

这是我在将这些 Array 变成 ArrayList 时一直在尝试做的事情:

/***        <<< CODE NOT COMPLETE >>>
   * reverses the order of the elemets in the array 
   ***/
  public static void reverse(ArrayList <Integer> a)
   {
       for (int i = 0; i < a.size()/2; i++)
       {
           int reverseOrder = a.get(i);
           a.get(i) = a.get(a.size() - 1 - i);
           a.get(a.size() - 1 - i) = reverseOrder;
       }
   } 

   /***        <<< CODE NOT COMPLETE >>>
   * merges two sorted arrays into 1 new array, maintains the sorted order 
   ***/
   public static ArrayList <Integer> merge (ArrayList <Integer> a, ArrayList <Integer> b) 
   {
       ArrayList <Integer> merge = new ArrayList <Integer> (a.size() + b.size());
       int i = 0, j = 0, k = 0;

       while (i < a.size() && j < b.size())
       {
            if (a.get(i) < b.get(j))
            {
                merge.get(k++) = a.get(i++);
            }

            else        
            {
                merge.get(k++) = b.get(j++);
            }
       }

       while (i < a.size())
       {
           merge.get(k++) = a.get(i++);
       }

       while (j < b.length)  
       {
           merge.get(k++) = b.get(i++);
       }

       return merge;
   }

【问题讨论】:

    标签: java arrays arraylist


    【解决方案1】:

    好的,所以我看到的主要问题是你的工作中有很多这样的代码:

    merge.get(i) = a.get(j);
    

    这实际上什么也没做。原因是ArrayList 实例的get 方法只返回您传入的索引处的当前值。您无法使用此方法设置该索引处的值,因为您必须使用实例方法set,像这样:

    merge.set(i, a.get(j));
    

    其中 i 是您要设置的索引,a.get(j) 是您要设置该索引的值。

    【讨论】:

    • 好的,至少允许我使用反向方法进行编译。但是,我仍然遇到一些问题。例如,在我正在反转的数组中,它打印前 3 个整数的索引位置,然后最后 3 个是实际的正确整数。奇怪的是,它为订单返回 false,这是它应该做的。所以编译器识别出它不是按顺序排列的,但是它只打印出一半的数字。通过我的合并,它可以编译,但是在我的 main 方法中,我不知道如何将其转换为 ArrayList,所以我看不出逻辑是否正确。
    • 这是我用来合并数组的数组版本,但我不确定如何将它与正在使用的 ArrayList 合并:int merge[] = merge(num3,num4) ;打印(合并);
    • 能否添加打印索引位置的代码?
    • 这是我打印出来的:---array example 1--- 4, 5, 9, 7, 3, 4, 8, 最大值是:9 最小值是: 3 顺序:false ---数组示例 2--- 24, 87, 96, 102, 874, 941,倒序:5, 4, 3, 96, 87, 24, 顺序:false ---数组示例 3--- 2, 6, 8, 9, 1, 3, 7, 9, 10, 合并数组:顺序:true
    • 据我所知,以相反的顺序,这些是索引位置,然后是最后 3 个整数。 941、874、102 应该是 5、4、3 所在的位置
    【解决方案2】:

    我在这里看到的主要问题是在左侧使用.get().get() 为您提供该索引处的内容,但它与数组的不同之处在于它不允许您在那里设置任何内容。

    为此,您需要set()

    例如,你的第一个方法应该有:

    a.set(i, a.get(a.size() - 1 - i));
    

    而不是:

    a.get(i) = a.get(a.size() - 1 - i);
    

    这里是关于set() 方法的JavaDocs,如果您想稍微了解一下(这很简单)。基本上使用数组arr[i] 为您提供i 的值,但也允许您在索引i 处设置内容。对于ArrayList,这两个操作是不同的方法。

    https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#set(int,%20E)

    【讨论】:

    • 好的,至少允许我使用反向方法进行编译。但是,我仍然遇到一些问题。例如,在我正在反转的数组中,它打印前 3 个整数的索引位置,然后最后 3 个是实际的正确整数。奇怪的是,它为订单返回 false,这是它应该做的。所以编译器识别出它不是按顺序排列的,但是它只打印出一半的数字。通过我的合并,它可以编译,但是在我的 main 方法中,我不知道如何将其转换为 ArrayList,所以我看不出逻辑是否正确。
    • 这是我用来合并数组的数组版本,但我不确定如何将它与正在使用的 ArrayList 合并:int merge[] = merge(num3,num4) ;打印(合并);
    猜你喜欢
    • 2016-07-20
    • 2015-11-10
    • 2013-07-22
    • 1970-01-01
    • 2019-05-17
    • 2019-04-10
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多