【问题标题】:Split array into two parts without for loop in java在java中没有for循环将数组拆分为两部分
【发布时间】:2011-04-20 13:24:56
【问题描述】:

我有一个大小为 300000 的数组,我希望它将它分成 2 个相等的部分。有什么方法可以在这里实现这个目标吗?

会比for循环操作更快还是不会对性能造成影响?

【问题讨论】:

    标签: java arrays


    【解决方案1】:

    您可以使用System.arraycopy()

    int[] source = new int[1000];
    
    int[] part1 = new int[500];
    int[] part2 = new int[500];
    
    //              (src   , src-offset  , dest , offset, count)
    System.arraycopy(source, 0           , part1, 0     , part1.length);
    System.arraycopy(source, part1.length, part2, 0     , part2.length);
    

    【讨论】:

    • 使用Arrays.copyOf()Arrays.copyOfRange() 可能会稍微快一些(但它肯定会更短的代码;-))。
    • @Joachim Arrays.copyOf()Arrays.copyOfRange() 也只是 System.arrayCopy() 的包装。他们只是有一个更漂亮的调用语法并进行一些基本的验证,仅此而已
    【解决方案2】:

    copyOfRange

    这可以满足您的需求,而无需创建新数组,因为它返回一个新数组。

    int[] original = new int[300000];
    int[] firstHalf = Arrays.copyOfRange(original, 0, original.length/2);
    

    【讨论】:

    • @Thomas 谢谢,已修复。我总是假设人们知道添加正确的命名空间、引用等,这是我需要改掉的一个坏习惯。
    • 请注意,'to' 参数是独占的(参见文档)。 int[] secondHalf = Arrays.copyOfRange(original, original.length/2, original.length);
    【解决方案3】:

    将一个数组拆分为多个具有固定最大大小的数组。

    public static <T extends Object> List<T[]> splitArray(T[] array, int max){
    
      int x = array.length / max;
      int r = (array.length % max); // remainder
    
      int lower = 0;
      int upper = 0;
    
      List<T[]> list = new ArrayList<T[]>();
    
      int i=0;
    
      for(i=0; i<x; i++){
    
        upper += max;
    
        list.add(Arrays.copyOfRange(array, lower, upper));
    
        lower = upper;
      }
    
      if(r > 0){
    
        list.add(Arrays.copyOfRange(array, lower, (lower + r)));
    
      }
    
      return list;
    }
    

    示例 - 一个 11 个数组应拆分为多个大小不超过 5 个的数组:

    // create and populate an array
    Integer[] arr = new Integer[11];
    
    for(int i=0; i<arr.length; i++){
      arr[i] = i;
    }
    
    // split into pieces with a max. size of 5
    List<Integer[]> list = ArrayUtil.splitArray(arr, 5);
    
    // check
    for(int i=0; i<list.size(); i++){
    
      System.out.println("Array " + i);
    
      for(int j=0; j<list.get(i).length; j++){
        System.out.println("  " + list.get(i)[j]);
      }
    }
    

    输出:

    Array 0
      0
      1
      2
      3
      4
    Array 1
      5
      6
      7
      8
      9
    Array 2
      10
    

    【讨论】:

    • 你的逻辑不会工作人:( Integer[] arr = new Integer[11]; 对于 11 个元素:只有 2 个数组:P
    • @Amit Singh 谢谢:我忘了剩下的。更正了代码。与其他一些答案不同,对于此解决方案,您不需要知道结果的维度。
    【解决方案4】:

    使用System.arraycopy

    【讨论】:

    • a) 这是一个指向 Java 1.4 的链接(1.6 已经存在 4 年以上)b) 一个例子就好了
    • @Sean:我经常只修复 a),因为没有充分的理由链接那些古老的文本;-)
    • @Sean:我希望有一天谷歌搜索“Java String”会指向文档的当前版本作为第一个结果;-)
    • @Joachim 这就是为什么我(可能还有这里的所有 Java 高级用户)总是用谷歌搜索 java &lt;classname&gt; /6
    【解决方案5】:

    使用此代码,它适用于 oddeven 列表大小。希望它对某人有所帮助。

     int listSize = listOfArtist.size();
     int mid = 0;
     if (listSize % 2 == 0) {
        mid = listSize / 2;
        Log.e("Parting", "You entered an even number. mid " + mid
                        + " size is " + listSize);
     } else {
        mid = (listSize + 1) / 2;
        Log.e("Parting", "You entered an odd number. mid " + mid
                        + " size is " + listSize);
     }
     //sublist returns List convert it into arraylist * very important
     leftArray = new ArrayList<ArtistModel>(listOfArtist.subList(0, mid));
     rightArray = new ArrayList<ArtistModel>(listOfArtist.subList(mid,
                    listSize));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-20
      • 2019-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多