Tôi có một mảng các số nguyên trong Java, tôi chỉ muốn sử dụng một phần của nó. Tôi biết trong Python bạn có thể làm một cái gì đó giống như mảng này [index:] và nó trả về mảng từ chỉ mục. Là một cái gì đó như thế này có thể có trong Java.
Tôi có một mảng các số nguyên trong Java, tôi chỉ muốn sử dụng một phần của nó. Tôi biết trong Python bạn có thể làm một cái gì đó giống như mảng này [index:] và nó trả về mảng từ chỉ mục. Là một cái gì đó như thế này có thể có trong Java.
Câu trả lời:
Độ dài của một mảng trong Java là bất biến. Vì vậy, bạn cần sao chép phần mong muốn dưới dạng một mảng mới.
Sử dụng copyOfRange
phương thức từ lớp java.util.Arrays :
int[] newArray = Arrays.copyOfRange(oldArray, startIndex, endIndex);
start Index là chỉ số ban đầu của phạm vi được sao chép, bao gồm.
end Index là chỉ mục cuối cùng của phạm vi được sao chép, độc quyền. (Chỉ số này có thể nằm ngoài mảng)
Ví dụ:
//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)
endIndex
kích thước lớn hơn kích thước của mảng được truyền làm đối số đầu tiên. Vì vậy, nếu bạn muốn có một bản sao đầy đủ, hãy tạo một biến tham chiếu đến mảng này và sử dụng Arrays.copyOfRange(var, 0, var.length)
hoặcArrays.copyOf(var, var.length)
Arrays.copyOfRange(Thread.currentThread().getStackTrace(),1,Short.MAX_VALUE)
ArrayIndexOutOfBoundsException
.
Có, bạn có thể sử dụng Arrays.copyOfRange
Nó cũng làm điều tương tự (lưu ý có một bản sao: bạn không thay đổi mảng ban đầu).
List
và subList
như được nêu trong câu trả lời của @ K-ballo.
Bạn co thể thử:
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);
Xem javadoc cho Hệ thống .
Nếu bạn đang sử dụng Java 1.6 trở lên, bạn có thể sử dụng Arrays.copyOfRange
để sao chép một phần của mảng. Từ javadoc:
Sao chép phạm vi chỉ định của mảng đã chỉ định thành một mảng mới. Chỉ số ban đầu của phạm vi (từ) phải nằm giữa 0 và
original.length
, bao gồm. Giá trị tạioriginal[from]
được đặt vào phần tử ban đầu của bản sao (trừ khifrom == original.length
hoặcfrom == to
). Các giá trị từ các phần tử tiếp theo trong mảng ban đầu được đặt vào các phần tử tiếp theo trong bản sao. Chỉ mục cuối cùng của phạm vi (to
), phải lớn hơn hoặc bằngfrom
, có thể lớn hơnoriginal.length
, trong trường hợp đófalse
được đặt trong tất cả các thành phần của bản sao có chỉ số lớn hơn hoặc bằngoriginal.length - from
. Độ dài của mảng trả về sẽ làto - from
.
Đây là một ví dụ đơn giản :
/**
* @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]);
}
}
Kiểm tra copyOfRange ; và ví dụ:
int[] arr2 = Arrays.copyOfRange(arr,0,3);
Bạn có thể sử dụng một cái gì đó như thế này: Arrays#copyOfRange
Bạn có thể sử dụng subList(int fromIndex, int toIndex)
phương thức trên mảng số nguyên của mình, đại loại như thế này:
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 + " ");
}
}
Đầu ra sẽ là : 2 3
.
Lưu ý rằng subList(int fromIndex, int toIndex)
phương thức thực hiện trừ 1 trên biến thứ 2 mà nó nhận được (var2 - 1), tôi không biết chính xác tại sao, nhưng đó là những gì xảy ra, có thể để giảm cơ hội vượt quá kích thước của mảng.
Arrays.copyOfRange(Thread.currentThread().getStackTrace(),1,255)
thay vì 255 Tôi không thể sử dụng Integer.MAX_VALUE, trong trường hợp tôi không muốn có được chiều dài thực sự