【问题标题】:Get only part of an Array in Java? [duplicate]只获取Java中数组的一部分? [复制]
【发布时间】:2012-06-15 15:13:00
【问题描述】:

我有一个 Java 整数数组,我只想使用其中的一部分。我知道在 Python 中你可以做这样的事情 array[index:] 它从索引中返回数组。在 Java 中这样的事情是可能的吗?

【问题讨论】:

    标签: java arrays


    【解决方案1】:

    Java 中数组的长度是不可变的。因此,您需要将所需的部分复制到一个新数组中。
    使用java.util.Arrays类中的copyOfRange方法:

    int[] newArray = Arrays.copyOfRange(oldArray, startIndex, endIndex);
    

    startIndex 是要复制的范围的初始索引,包括在内。
    endIndex 是要复制的范围的最终索引,不包括。 (这个索引可能在数组之外)

    例如:

       //index   0   1   2   3   4
    int[] arr = {10, 20, 30, 40, 50};
    Arrays.copyOfRange(arr, 0, 2);          // returns {10, 20}
    Arrays.copyOfRange(arr, 1, 4);          // returns {20, 30, 40}
    Arrays.copyOfRange(arr, 2, arr.length); // returns {30, 40, 50} (length = 5)
    

    【讨论】:

    • 似乎有大小限制?只有这个有效:Arrays.copyOfRange(Thread.currentThread().getStackTrace(),1,255) 而不是 255 我不能使用 Integer.MAX_VALUE,以防我不想获得实际长度
    • @AquariusPower 大小限制是数组大小,它可以大于 255。您不能提供大于作为第一个参数传递的数组大小的endIndex。因此,如果您想要完整副本,请创建一个引用此数组的变量并使用 Arrays.copyOfRange(var, 0, var.length)Arrays.copyOf(var, var.length)
    • 我必须为 stacktrace 子数组创建一个本地变量,但我发现这行得通!!! Arrays.copyOfRange(Thread.currentThread().getStackTrace(),1,Short.MAX_VALUE)
    • 小心ArrayIndexOutOfBoundsException
    • 还有一个问题。如果我需要将长度为 500K 的字符串数组拆分为 250K 的子数组怎么办。这些方法接受最大输出为 65000 的 interegr。
    【解决方案2】:

    您可以将数组包装为列表,并请求它的子列表。

    MyClass[] array = ...;
    List<MyClass> subArray = Arrays.asList(array).subList(index, array.length);
    

    【讨论】:

      【解决方案3】:

      是的,您可以使用Arrays.copyOfRange

      它做同样的事情(注意有一个副本:你不改变初始数组)。

      【讨论】:

      • 也就是说,如果您不想制作明确的副本,则需要使用@K-ballo 的答案中所述的ListsubList
      • 没错。 Java 没有现代语言提供的数组切片功能。
      • 我不确定我是否会这样说,但是……是的,Java 不提供数组切片。 (也就是说,这种方法有一些优点:减少内存泄漏的可能性,通过避免额外的字段来减少数组开销等。你可以选择任何一种方式。)
      • 是的,你又是对的(我并没有试图发动一场火焰战争;))。切片使 GC 非常复杂。当 Java 尝试在字符串中使用基于对象的隐式切片时 it made it more evident that this was dangerous.
      【解决方案4】:

      你可以试试:

      System.arraycopy(sourceArray, 0, targetArray, 0, targetArray.length);// copies whole array
      
      // copies elements 1 and 2 from sourceArray to targetArray
      System.arraycopy(sourceArray, 1, targetArray, 0, 2); 
      

      javadoc for System

      【讨论】:

      • 我只是喜欢这正是 Arrays.copyOf() 和 Arrays.copyOfRange() 的实际实现方式(无边界检查),但它没有投票,而开销稍高的实用程序方法包装器机架尽管 System.arraycopy 的历史可以追溯到 1995 年,但仍获得了高票。
      • 我猜它看起来对某些人来说不够“现代”。
      • 我喜欢老学校,没有闪亮的花里胡哨,只有所需的机器。就像 C 中的 memcpy 一样
      • 但是使用 arrays.copyOfRange() 增加了可读性并显着降低了错误的可能性。
      【解决方案5】:

      如果您使用的是 Java 1.6 或更高版本,则可以使用 Arrays.copyOfRange 复制数组的一部分。来自 javadoc:

      将指定数组的指定范围复制到一个新数组中。范围 (from) 的初始索引必须介于零和 original.length 之间,包括端点。 original[from] 的值被放入副本的初始元素中(除非from == original.lengthfrom == to)。原始数组中后续元素的值被放入副本中的后续元素中。范围的最终索引(to),必须大于或等于from,可能大于original.length,在这种情况下false被放置在索引更大的副本的所有元素中大于或等于original.length - from。返回数组的长度为to - from

      这是simple example

      /**
       * @Program that Copies the specified range of the specified array into a new 
       * array.
       * CopyofRange8Array.java 
       * Author:-RoseIndia Team
       * Date:-15-May-2008
       */
      import java.util.*;
      public class CopyofRange8Array {
          public static void main(String[] args) {
             //creating a short array
             Object T[]={"Rose","India","Net","Limited","Rohini"};
              // //Copies the specified  short array upto specified range,
              Object T1[] = Arrays.copyOfRange(T, 1,5);
              for (int i = 0; i < T1.length; i++) 
                  //Displaying the Copied short array upto specified range
                  System.out.println(T1[i]);
          }
      
      }
      

      【讨论】:

        【解决方案6】:

        查看copyOfRange;和例子:

        int[] arr2 = Arrays.copyOfRange(arr,0,3);
        

        【讨论】:

          【解决方案7】:

          你可以这样使用:Arrays#copyOfRange

          【讨论】:

            【解决方案8】:
            public static int[] range(int[] array, int start, int end){
                    int returner[] = new int[end-start];
                    for(int x = 0; x <= end-start-1; x++){
                        returner[x] = array[x+start];
                    }
                    return returner;
                }
            

            这是一种与 Array.copyOfRange 执行相同操作但不导入任何内容的方法

            【讨论】:

            • returner[x] = array[x+start]; 不复制数组。
            【解决方案9】:

            您可以在整数 arr 上使用 subList(int fromIndex, int toIndex) 方法,如下所示:

            import java.util.ArrayList;
            import java.util.List;
            
            public class Main {
                public static void main(String[] args) {
                    List<Integer> arr = new ArrayList<>();
                    arr.add(1);
                    arr.add(2);
                    arr.add(3);
                    arr.add(4);
                    List<Integer> partialArr = arr.subList(1, 3);
            
                    // print the subArr
                    for (Integer i: partialArr)
                        System.out.println(i + " ");
                }
            }
            

            输出将是:2 3

            请注意,subList(int fromIndex, int toIndex) 方法对其接收的第二个变量 (var2 - 1) 执行负 1,我不知道确切原因,但这就是发生的情况,可能是为了减少超出数组大小的机会。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-05-23
              • 1970-01-01
              • 2021-12-17
              • 2012-05-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多