Jak utworzyć podtablicę z innej tablicy w Javie?

284

Jak utworzyć pod-tablicę z innej tablicy? Czy istnieje metoda pobierająca indeksy z pierwszej tablicy, taka jak:

methodName(object array, int start, int end)

Nie chcę omijać tworzenia pętli i narażania mojego programu na cierpienia.

Wciąż pojawia się błąd:

nie można znaleźć metody symbolu copyOfRange (int [], int, int)

To jest mój kod:

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);
    }
}
Zdobyć
źródło

Odpowiedzi:

305

Możesz użyć

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

Jigar Joshi
źródło
3
Miałem pewne problemy z brakiem Object [] w moim Arrays.copyOfRange. Sprawdź import, aby upewnić się, że używasz java.util.Arrays. W jakiś sposób zaimportowano inną wersję tablic i zmarnowałem 15 minut na sprawdzenie JRE i JDK pod kątem problemu.
NuclearPeon
@NuclearPeon Dziękuję !!! Zajęłoby mi to dużo czasu, zanim sam to rozgryzłem. Eclipse automatycznie importowane org.bouncycastle.util.Arrays.
anddero
136

Arrays.copyOfRange(..)został dodany w Javie 1.6. Więc może nie masz najnowszej wersji. Jeśli aktualizacja nie jest możliwa, spójrz naSystem.arraycopy(..)

Bozho
źródło
1
@Sami albo zaktualizuj do wersji 1.6 lub zapoznaj się z tym dokumentem w celu pobrania download.oracle.com/javase/1.4.2/docs/api/java/lang/System.html
Jigar Joshi
4
Od którego dostawcy jest twój JDK. Firma Sun / Oracle nigdy nie wydała wersji 4.00.28, a Google również nie mogła jej znaleźć.
Peter Lawrey,
copyOfRange nulls końcowe elementy, jeśli są poza zakresem tablicy źródłowej zamiast
alokować
12
ktoś powinien dodać w odpowiedzi, że chociaż „indeks początkowy” obejmuje, „indeks końcowy” jest wyłączny
Yan King Yin
@YanKingYin masz rację - to jest dokładnie to, co czytałem komentarze :)
Ben Kushigian
43

Użyj metody copyOfRange z klasy java.util.Arrays:

int[] newArray = Arrays.copyOfRange(oldArray, startIndex, endIndex);

Po więcej szczegółów:

Link do podobnego pytania

Dhirendra Pratap
źródło
20

Tak, nazywa się System.arraycopy (Object, int, Object, int, int) .

Nadal jednak gdzieś będzie wykonywać pętlę, chyba że da się to zoptymalizować REP STOSWza pomocą JIT (w którym to przypadku pętla znajduje się w 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
Gerco Dries
źródło
7

Korzystając z Apache ArrayUtils do pobrania pod tym linkiem , możesz łatwo skorzystać z tej metody

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

„boolean” to tylko przykład, istnieją metody dla wszystkich pierwotnych typów Java

Alessandro Muzzi
źródło
6

JDK> = 1,8

Zgadzam się ze wszystkimi powyższymi odpowiedziami. Jest także dobry sposób z strumieniami Java 8:

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

Zaletą tego jest to, że może być przydatny dla wielu różnych typów tablic „src” i pomaga usprawnić zapisywanie operacji potoku w strumieniu.

Nie dotyczy to tego pytania, ale na przykład, jeśli tablica źródłowa była double[]i chcemy wziąć average()pod-tablicę:

double avg = IntStream.range(startInclusive, endExclusive)
                    .mapToDouble(index -> src[index])
                    .average()
                    .getAsDouble();
enator
źródło
3
int newArrayLength = 30; 

int[] newArray = new int[newArrayLength];

System.arrayCopy(oldArray, 0, newArray, 0, newArray.length);
Milan Jaros
źródło
2

Kod jest poprawny, więc domyślam się, że używasz starszego JDK. Jawadoc dla tej metody mówi, że jest tam od 1.6. W wierszu polecenia wpisz:

java -version

Zgaduję, że nie korzystasz z wersji 1.6

Merky
źródło
1

Ja używasz java przed wersją 1.6 użyj System.arraycopy()zamiast tego. Lub zaktualizuj swoje środowisko.

AlexR
źródło