java中如何分割---合并数组

分割数组:将数组分割成指定最大长度的几个数组


    /**
     * 分割数组
     *
     * @param array 原数组
     * @param Size  分割后每个数组的最大长度
     * @param <T>   原数组的类型
     * @return
     */
    public <T> List<Object[]> split_array(T[] array, int Size) {
        List<Object[]> list = new ArrayList();
        int i = (array.length) % Size == 0 ? (array.length) / Size : (array.length) / Size + 1;
        for (int j = 0; j < i; j++) {
            List<T> list1 = new ArrayList();
            for (int k = 0; k < Size; k++) {
                if ((j * Size + k) >= array.length) {
                    break;
                } else {
                    list1.add((array[j * Size + k]));
                }
            }
            /**
             * list.toArray()之后只能转成Object类型的数组,不能转成int和Integer等
             * 否则会报:java.lang.ClassCastException: 
             * [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;
             * 非检测性异常
             * 所以只能是List<Object[]>,不能是List<T[]>
             */
            list.add(list1.toArray());
        }
        return list;

    }

注意:list.toArray()之后只能转成Object类型的数组,不能转成int和Integer等其他类型,不然会报错。我们可以点开.toArray()源码,他返回的就是一个Object类型的数组。

这里写图片描述

合并数组:将几个数组合并成为一个数组

   /**
     * 合并数组
     *
     * @param original   原数组
     * @param add_arrays 需要增加的数组
     * @param <T>        数组的类型
     * @return
     */
    public <T> T[] concat_array(T[] original, T[]... add_arrays) {
        int o_length = original.length;
        for (T[] array : add_arrays) {
            o_length += array.length;
        }
        //先定义出指定长度的数组
        T[] new_Array = Arrays.copyOf(original, o_length);
        for (T t : new_Array) {
            System.out.print(t + ":");
        }
        System.out.println();
        int o_length1 = original.length;
        for (T[] array : add_arrays) {
            //System提供了一个静态方法arraycopy(),可以使用它来实现数组之间的复制
            /**
             * 第一个参数表示要增加的数组
             * 第二个参数表示要增加数组的开始下标(从增加数组的那个下标开始取值)
             * 第三个参数表示结果数组(被增加的数组)
             * 第四个参数表示从结果数组(被增加的数组)那个下标开始赋值
             * 第五个参数表示取增加数组值的长度
             * 这个例子中:表示将array从下标0开始获取array长度个元素,即获取整个array的元素
             * 赋值给new_array,从new_array下标o_length1(original的长度)的地方开始赋值
             */
            for (T t : array) {
                System.out.print(t + ":");
            }
            System.out.println();
            System.arraycopy(array, 0, new_Array, o_length1, array.length);
            o_length1 += array.length;
        }
        return new_Array;
    }

测试:

 @Test
    public void test() {
        /**
         * 将a数组,分割成为长度为4的几个数组
         */
        Integer[] a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14};
        List list = split_array(a, 4);
        for (int y = 0; y < list.size(); y++) {
            //int[] a1 = (int[]) list.get(y);
            Object[] a1 = (Object[]) list.get(y);
            for (int r = 0; r < a1.length; r++) {
                System.out.print(a1[r] + "    ");
            }
            System.out.println();
        }
        System.out.println("=================================");
        String[] st = {"A", "B", "C", "D", "E"};
        String[] dt = {"F", "G", "H", "I", "J"};
        String a2[] = concat_array(st, dt);
        for (String i : a2) {
            System.out.print(i + "  ");
        }

    }

测试结果:

这里写图片描述

猜你喜欢

转载自blog.csdn.net/tuesdayma/article/details/79113129