Как создать вложенный массив из другого массива в 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 [] в моем Arrays.copyOfRange. Проверьте импорт, чтобы убедиться, что вы используете java.util.Arrays. Каким-то образом была импортирована другая версия Arrays, и я потратил 15 минут на проверку JRE и JDK для решения этой проблемы.
NuclearPeon
@ NuclearPeon Спасибо !!! Это заняло бы у меня много времени, прежде чем я сам это понял. Затмение автоматически импортируется org.bouncycastle.util.Arrays.
Андеро
136

Arrays.copyOfRange(..)был добавлен в Java 1.6. Так что, возможно, у вас нет последней версии. Если обновление невозможно, посмотрите наSystem.arraycopy(..)

Bozho
источник
1
@Sami либо обновите до 1.6, либо посмотрите этот документ для справки download.oracle.com/javase/1.4.2/docs/api/java/lang/System.html
Джигар Джоши,
4
От какого поставщика ваш JDK. Sun / Oracle никогда не выпускала версию 4.00.28, и Google тоже не смог ее найти.
Питер Лори
copyOfRange обнуляет конечные элементы, если они находятся вне диапазона исходного массива, вместо выделения меньшего массива :(
Даниэль С. Яицков
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
Герко Дрис
источник
7

Используя Apache ArrayUtils, загружаемый по этой ссылке, вы можете легко использовать метод

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

"логическое" является только примером, есть методы для всех типов примитивов Java

Алессандро Муцци
источник
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();
Enator
источник
3
int newArrayLength = 30; 

int[] newArray = new int[newArrayLength];

System.arrayCopy(oldArray, 0, newArray, 0, newArray.length);
Милан Ярош
источник
2

Код правильный, поэтому я предполагаю, что вы используете более старый JDK. Javadoc для этого метода говорит, что он существует с 1.6. В командной строке введите:

java -version

Я предполагаю, что у вас не работает 1.6

Merky
источник
1

Если вы используете Java до версии 1.6, используйте System.arraycopy()вместо этого. Или обновите свою среду.

AlexR
источник