Java'da başka bir diziden alt dizi nasıl oluşturulur?


284

Başka bir diziden alt dizi nasıl oluşturulur? Dizinleri ilk diziden alan bir yöntem var mı:

methodName(object array, int start, int end)

Döngüler ve programımın acı çekmesini istemiyorum.

Hata almaya devam ediyorum:

sembol yöntemi bulunamıyor copyOfRange (int [], int, int)

Bu benim kodum:

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

Yanıtlar:


305

Kullanabilirsiniz

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
Arrays.copyOfRange içinde Object [] s olmaması ile ilgili bazı sorunlar yaşıyordu. Java.util.Arrays kullandığınızdan emin olmak için içe aktarmalarınızı kontrol edin. Her nasılsa farklı Diziler sürümü içe aktarıldı ve JRE ve JDK'ları kontrol etmek için 15 dakika harcadım.
NuclearPeon

@NuclearPeon Teşekkür ederim !!! Ben kendim anladım önce uzun bir zaman alacaktı. Eclipse otomatik olarak içe aktarıldı org.bouncycastle.util.Arrays.
anddero

136

Arrays.copyOfRange(..)Java 1.6'da eklendi. Yani belki de en son sürüme sahip değilsiniz. Yükseltme mümkün değilse,System.arraycopy(..)


1
@Sami ya 1.6 yükseltme ya da referans için bu belgeye bakın download.oracle.com/javase/1.4.2/docs/api/java/lang/System.html
Jigar Joshi

4
JDK'nız hangi satıcıdan. Sun / Oracle 4.00.28 sürümünü hiç yayınlamadı ve google da bulamadı.
Peter Lawrey

copyOfRange, daha küçük bir dizi
ayırmak

12
Birisi "başlangıç ​​endeksi" kapsayıcı olsa da, "son endeksi" münhasır
Yan King Yin

@YanKingYin haklısın - bu tam olarak yorumlarını okuduğum şey :)
Ben Kushigian



7

Bu bağlantıda indirilebilir Apache ArrayUtils kullanarak yöntemi kolayca kullanabilirsiniz

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

"boolean" sadece bir örnektir, tüm ilkel java türleri için yöntemler vardır


6

JDK> = 1.8

Yukarıdaki tüm cevaplara katılıyorum. Java 8 Akışları ile de güzel bir yol var:

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

Bunun yararı, "src" dizisinin birçok farklı türü için yararlı olabilmesidir ve akışta ardışık düzen işlemlerinin geliştirilmesine yardımcı olur.

Bu soru hakkında özel değil, örneğin, kaynak dizi ise double[]ve average()alt diziyi almak istiyorsak :

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

Eski bir JDK kullandığınızı tahmin kod doğru. Bu yöntem için javadoc, 1.6'dan beri orada olduğunu söylüyor. Komut satırına şunu yazın:

java -version

1,6 çalıştırmadığınızı tahmin ediyorum


1

Bunun System.arraycopy()yerine 1.6 sürümünü kullanmadan önce java kullanıyorum . Veya ortamınızı yükseltin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.