Làm thế nào để tạo một mảng con từ một mảng khác trong Java?


284

Làm thế nào để tạo một mảng con từ một mảng khác? Có một phương thức lấy các chỉ mục từ mảng đầu tiên, chẳng hạn như:

methodName(object array, int start, int end)

Tôi không muốn đi qua các vòng lặp và làm cho chương trình của tôi bị ảnh hưởng.

Tôi liên tục nhận được lỗi:

không thể tìm thấy phương thức ký hiệu copyOfRange (int [], int, int)

Đây là mã của tôi:

import java.util.*;

public class testing 
{
    public static void main(String [] arg) 
    {   
        int[] src = new int[] {1, 2, 3, 4, 5}; 
        int b1[] = Arrays.copyOfRange(src, 0, 2);
    }
}

Câu trả lời:


305

Bạn có thể dùng

JDK> 1,5

Arrays.copyOfRange(Object[] src, int from, int to)

Javadoc

JDK <= 1,5

System.arraycopy(Object[] src, int srcStartIndex, Object[] dest, int dstStartIndex, int lengthOfCopiedIndices); 

Javadoc


3
Tôi đã gặp một số vấn đề khi không có Object [] trong Arrays.copyOfRange của mình. Kiểm tra nhập khẩu của bạn để đảm bảo bạn đang sử dụng java.util.Arrays. Bằng cách nào đó, một phiên bản Mảng khác đã được nhập và tôi đã lãng phí 15 phút để kiểm tra JRE và JDK cho vấn đề này.
NuclePeon

@NuclePeon Cảm ơn bạn !!! Sẽ phải mất một thời gian dài trước khi tôi tự tìm ra nó. Eclipse tự động được nhập org.bouncycastle.util.Arrays.
anddero

136

Arrays.copyOfRange(..)đã được thêm vào trong Java 1.6. Vì vậy, có lẽ bạn không có phiên bản mới nhất. Nếu không thể nâng cấp, hãy nhìn vàoSystem.arraycopy(..)


1
@Sami hoặc nâng cấp lên 1.6 hoặc xem tài liệu này để tải về
Jigar Joshi

4
Nhà cung cấp nào là JDK của bạn. Sun / Oracle chưa bao giờ phát hành phiên bản 4,00.28 và google cũng không thể tìm thấy.
Peter Lawrey

copyOfRange null các phần tử theo dõi nếu chúng nằm ngoài phạm vi mảng nguồn thay vì phân bổ một mảng nhỏ hơn :(
Daneel S. Yaitskov

12
ai đó nên thêm vào câu trả lời rằng trong khi "chỉ số bắt đầu" được bao gồm, "chỉ số kết thúc" là độc quyền
Yan King Yin

@YanKingYin bạn đúng - đây chính xác là những gì tôi đã đọc các bình luận cho :)
Ben Kushigian


20

Vâng, nó được gọi là System.arraycopy (Object, int, Object, int, int) .

Mặc dù vậy, nó vẫn sẽ thực hiện một vòng lặp ở đâu đó, trừ khi điều này có thể được tối ưu hóa thành một cái gì đó giống như REP STOSWJIT (trong trường hợp đó là vòng lặp bên trong CPU).

int[] src = new int[] {1, 2, 3, 4, 5};
int[] dst = new int[3];

System.arraycopy(src, 1, dst, 0, 3); // Copies 2, 3, 4 into dst

7

Sử dụng Apache ArrayUtils có thể tải xuống tại liên kết này, bạn có thể dễ dàng sử dụng phương thức

subarray(boolean[] array, int startIndexInclusive, int endIndexExclusive) 

"boolean" chỉ là một ví dụ, có các phương thức cho tất cả các kiểu java nguyên thủy


6

JDK> = 1,8

Tôi đồng ý với tất cả các câu trả lời ở trên. Ngoài ra còn có một cách hay với Luồng Java 8:

int[] subArr = IntStream.range(startInclusive, endExclusive)
                        .map(i -> src[i])
                        .toArray();

Lợi ích của việc này là, nó có thể hữu ích cho nhiều loại mảng "src" khác nhau và giúp cải thiện việc viết các hoạt động đường ống trên luồng.

Không đặc biệt về câu hỏi này, nhưng ví dụ, nếu mảng nguồn là double[]và chúng tôi muốn lấy average()mảng con:

double avg = IntStream.range(startInclusive, endExclusive)
                    .mapToDouble(index -> src[index])
                    .average()
                    .getAsDouble();

3
int newArrayLength = 30; 

int[] newArray = new int[newArrayLength];

System.arrayCopy(oldArray, 0, newArray, 0, newArray.length);

2

Mã này là chính xác vì vậy tôi đoán rằng bạn đang sử dụng JDK cũ hơn. Javadoc cho phương thức đó nói rằng nó đã ở đó từ 1.6. Tại loại dòng lệnh:

java -version

Tôi đoán rằng bạn không chạy 1.6


1

Tôi bạn đang sử dụng java trước phiên bản 1.6 sử dụng System.arraycopy()thay thế. Hoặc nâng cấp môi trường của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.