Scala'da bir alt dizi elde etmenin doğru yolu nedir?


97

Ölçekli bir alt dizi almaya çalışıyorum ve bunu yapmanın doğru yolunun ne olduğu konusunda biraz kafam karıştı. En çok istediğim şey, bunu python'da nasıl yapabileceğiniz gibi bir şey olurdu:

x = [3, 2, 1]
x[0:2]

ama bunu yapamayacağına oldukça eminim.

Bunu yapmanın en açık yolu, Java Dizileri kullanım kitaplığını kullanmak olacaktır.

import java.util.Arrays
val start = Array(1, 2, 3)
Arrays.copyOfRange(start, 0, 2)

Ama Scala'da Java kitaplıklarını kullanmak beni her zaman biraz kirli hissettiriyor. Bunu yapmanın en "ölçekleyici" yolu,

def main(args: List[String]) {
    val start = Array(1, 2, 3)
    arrayCopy(start, 0, 2)
}
def arrayCopy[A](arr: Array[A], start: Int, end: Int)(implicit manifest: Manifest[A]): Array[A] = {
    val ret = new Array(end - start)
    Array.copy(arr, start, ret, 0, end - start)
    ret
}

ama daha iyi bir yol var mı?

Yanıtlar:


134

Dilim yöntemini çağırabilirsiniz:

scala> Array("foo", "hoo", "goo", "ioo", "joo").slice(1, 4)
res6: Array[java.lang.String] = Array(hoo, goo, ioo)

Python'daki gibi çalışır.


3
ah, tabi ki, ArrayOps scala-lang.org/api/current/scala/collection/mutable/… , ben aptalım.
nnythm

Evet haklısın. Sınırlı sözleşmelere atıfta bulunuyordum. Alt sınır dahil edilir ve üst sınır çıkarılır. İzde :de yok .
paradigmatik

@nnythm Bağlantı kafa.
Amir A. Shabani

Görünüşe göre bu eski bir yorumu düzenleyemiyorum, ancak canlı bir bağlantı: scala-lang.org/api/2.12.8/scala/collection/mutable/…
nnythm

15

İle arasındaki öğeleri içeren bir diziniz olduğunu hayal edin a.f

scala> val array = ('a' to 'f').toArray // Array('a','b','c','d','e','f')

Daha sonra bir alt diziyi farklı şekillerde çıkartabilirsiniz:

  1. İlk n birinci öğeyi bırakarak drop(n: Int)

    array.drop(2) // Array('c','d','e','f')

  2. İle ilk n öğeyi alın take(n: Int)

    array.take(4) // Array('a','b','c','d')

  3. İle herhangi bir öğe aralığını seçin slice(from: Int, until: Int). untilHariç bırakıldığını unutmayın .

    array.slice(2,4) // Array('c','d')

    Dilim yöntemi kesinlikle şuna eşdeğerdir:
    array.take(4).drop(2) // Array('c','d')

  4. Son n öğeyi şununla hariç tut dropRight(n: Int):

    array.dropRight(4) // Array('a','b')

  5. Son n öğeyi şu şekilde seçin takeRight(n: Int):

    array.takeRight(4) // Array('c','d','e','f')

Referans : Resmi belgeler


1

2D Scala Array'den (orijinal_array) belirli sütunların çıkarılmasına bir örnek:

import scala.collection.mutable.ArrayBuffer

val sub_array = ArrayBuffer[Array[String]]()
val columns_subset: Seq[String] = Seq("ColumnA", "ColumnB", "ColumnC")
val columns_original = original_array(0)

for (column_now <- columns_subset) {
      sub_array += original_array.map{_(columns_original.indexOf(column_now))}
    }
sub_array
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.