Как создать дополнительный массив из другого массива в Java?

Как создать под-массив из другого массива? Есть ли метод, который принимает индексы из первого массива, такие как:

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

Ответ 1

Вы можете использовать

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

Ответ 2

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

Ответ 4

Да, он называется System.arraycopy(Object, int, Object, int, int).

По-прежнему будет выполняться цикл где-нибудь, хотя это может быть оптимизировано JT (например, REP STOSW), в этом случае цикл находится внутри ЦП.

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

Ответ 5

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

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

"boolean" - только пример, существуют методы для всех примитивов java types

Ответ 6

int newArrayLength = 30; 

int[] newArray = new int[newArrayLength];

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

Ответ 7

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

java -version

Я предполагаю, что вы не используете 1.6

Ответ 8

Я использую java до версии 1.6 вместо System.arraycopy(). Или обновите среду.

Ответ 9

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