Як створити підмасив з іншого масиву на Java?


284

Як створити підмасив з іншого масиву? Чи існує метод, який бере індекси з першого масиву, такі як:

methodName(object array, int start, int end)

Я не хочу перебирати петлі та змушувати страждати програму.

Я продовжую отримувати помилку:

не вдається знайти метод символу copyOfRange (int [], int, int)

Це мій код:

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);
    }
}

Відповіді:


305

Можна використовувати

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
У мене виникли проблеми з відсутністю Object [] s у моєму Arrays.copyOfRange. Перевірте свій імпорт, щоб переконатися, що ви використовуєте java.util.Arrays. Якимось чином імпортувалася інша версія масивів, і я витратив 15 хвилин на перевірку JRE та JDK.
NuclearPeon

@NuclearPeon Дякую !!! Взяв би мене довгий час, перш ніж я сам зрозумів це. Eclipse імпортується автоматично org.bouncycastle.util.Arrays.
anddero

136

Arrays.copyOfRange(..)додано в Java 1.6. Тому, можливо, у вас немає останньої версії. Якщо оновити неможливо, подивітьсяSystem.arraycopy(..)


1
@Sami або оновіть до 1.6 або перегляньте цей документ для посилання download.oracle.com/javase/1.4.2/docs/api/java/lang/System.html
Jigar Joshi

4
Від якого постачальника ваш JDK. Sun / Oracle ніколи не випускав версію 4.00.28 і Google також не міг її знайти.
Пітер Лоурі

copyOfRange зазначає нульові елементи, якщо вони виходять із вихідного масиву замість виділення меншого масиву :(
Daneel S. Yaitskov,

12
хтось повинен додати у відповідь, що хоча "індекс старту" включений, "кінцевий індекс" є ексклюзивним
Ян Кінг Інь

@YanKingYin ви праві - це саме те, що я читав коментарі для :)
Бен Кушиґян


20

Так, це називається System.arraycopy (Object, int, Object, int, int) .

Хоча цикл все ще буде виконуватись десь, якщо тільки це не вдається оптимізувати щось на зразок REP STOSWJIT (в цьому випадку цикл знаходиться всередині процесора).

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


6

JDK> = 1,8

Я згоден з усіма відповідями вище. Також є хороший спосіб з Java 8 Streams:

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

Перевага в цьому полягає в тому, що він може бути корисним для багатьох різних типів масиву "src" і допомагає покращити операції написання конвеєра на потоці.

Не конкретно щодо цього питання, але, наприклад, якщо масив джерела був double[]і ми хотіли взяти average()підмасив:

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


2

Код правильний, тому я гадаю, що ви використовуєте старіший JDK. Явадок для цього методу говорить, що він існує з 1.6. У командному рядку:

java -version

Я здогадуюсь, що ви не працює 1.6


1

I ви використовуєте Java раніше, ніж версія 1.6 System.arraycopy(). Або оновити своє оточення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.