2010-08-19 14 views
7

Có cách nào để xây dựng mảng đa chiều động trong Scala không? Tôi biết mảng ở Scala phải được khởi tạo về kích thước và kích thước của nó, vì vậy tôi không muốn điều đó. Cấu trúc dữ liệu phải năng động. Tôi đã cố gắng để xây dựng nó với danh sách trong danh sách, nhưng tôi bị mất một số cách.mảng đa chiều có thể biến đổi năng động scala như datastructures

Có rất nhiều loại khác nhau, có thể tôi không tìm đúng loại. Vì vậy, hãy đẩy tôi đi đúng hướng.

Trả lời

6

Nếu bạn muốn làm một cái gì đó giống như

một (5) = // kết quả của một số tính toán

thì bạn sẽ cần sử dụng thứ gì đó từ phân cấp bộ sưu tập có thể thay đổi. Tôi muốn đề xuất ArrayBuffer.

scala> import scala.collection.mutable.ArrayBuffer 
import scala.collection.mutable.ArrayBuffer 

scala> val a = ArrayBuffer.fill(3,3)(0) 
a: scala.collection.mutable.ArrayBuffer[scala.collection.mutable.ArrayBuffer[Int]] = ArrayBuffer(ArrayBuffer(0, 0, 0), ArrayBuffer(0, 0, 0), ArrayBuffer(0, 0, 0)) 

scala> a(2)(1) = 4 

scala> a(0) = ArrayBuffer(1,2,3) 

scala> a 
res2: scala.collection.mutable.ArrayBuffer[scala.collection.mutable.ArrayBuffer[Int]] = ArrayBuffer(ArrayBuffer(1, 2, 3), ArrayBuffer(0, 0, 0), ArrayBuffer(0, 4, 0)) 

Lưu ý rằng fill cho phép bạn tự động tạo và khởi tạo cấu trúc 5D. Cũng lưu ý rằng bạn có thể mở rộng độ dài này, nhưng nó sẽ không mở rộng toàn bộ cấu trúc đa chiều, chỉ là cấu trúc mà bạn thêm vào. Vì vậy, ví dụ:

scala> a(2) += 7 // Add one element to the end of the array 
res3: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(0, 4, 0, 7) 

scala> a 
res4: scala.collection.mutable.ArrayBuffer[scala.collection.mutable.ArrayBuffer[Int]] 
= ArrayBuffer(ArrayBuffer(1, 2, 3), ArrayBuffer(0, 0, 0), ArrayBuffer(0, 4, 0, 7)) 
+0

cảm ơn bạn rất nhiều. – evildead

+0

Tôi nhận xét nó ở đây một lần nữa, như tôi thấy bây giờ vấn đề của tôi đã được sử dụng 2,7,7 từ phân phối của tôi. Tôi đã tự hỏi tại sao tất cả những điều tôi phát hiện ra ở đó không làm việc cho tôi. Bây giờ với 2,8 tất cả các công trình tốt. Tôi đã thử nghiệm câu trả lời của bạn và evrything hoạt động tốt. Chính xác những gì tôi cần. Cảm ơn một lần nữa – evildead

4

Vâng, nó phụ thuộc rất nhiều vào những gì bạn định làm, nhưng dự đoán tốt nhất của bạn là IndexedSeq[IndexedSeq[T]] (hoặc lồng sâu hơn), sử dụng Vector khi triển khai cho IndexedSeq (đó là cách triển khai mặc định).

Ví dụ:

scala> IndexedSeq (IndexedSeq (1, 2, 3), IndexedSeq (4, 5), IndexedSeq (6, 7, 8, 9)) res0: IndexedSeq [IndexedSeq [Int ]] = Vector (Vector (1, 2, 3), Vector (4, 5), Vector (6, 7, 8, 9))

+0

Xin chào, bạn đã trả lời câu hỏi của bạn. Làm cách nào để tôi có quyền truy cập vào một giá trị duy nhất trong IndexSequence này, ví dụ: thứ hai "hàng", thứ hai "cột", res0 (2) (2) hoặc một cái gì đó như thế? – evildead

+2

@evildead: Có. Nhưng như tôi chắc chắn bạn biết, Scala có một REPL, do đó, những thứ như thế ít nhất là dễ dàng để xác nhận mình theo kinh nghiệm khi họ được xác nhận ở đây. Oh, ngoại trừ hàng thứ hai và cột thứ hai sẽ là 'vectorOfVectors (1) (1)'. –

+0

Vâng tôi, tôi chỉ muốn tránh bất kỳ sai lầm nào :) Và tất nhiên là (1) (1), đã đến tối muộn. Cảm ơn bạn. – evildead

3

Bạn có thể tạo một mảng gồm 2 độ mờ động như sau:

val aa : Array[Array[Int]] = Array.ofDim (3, 4) 

Vâng, vâng, tôi thấy, kích thước đã được sửa. Làm thế nào về điều đó:

val i = random.nextInt (5) + 1 
val j = new GregorianCalendar(). get (Calendar.DAY_OF_WEEK) 
val aa : Array[Array[Int]] = Array.ofDim (i, j) 

Có, nó bị ràng buộc với hai chiều. Bạn sẽ sử dụng một mảng thứ nguyên chưa biết trước đó như thế nào?

Vâng - ít nhất, bạn có thể:

val aa : Array [Int] = Array.ofDim (2) 

aa: Array [Int] = Array (0, 0)

val aaa = Array.fill (3) (aa)   

aaa: Array [Array [Int]] = Array (Array (0, 0), Array (0, 0), Array (0, 0))

+0

'val aa = Array.ofDim [Int] (3, 4)' là một chút đẹp hơn và làm điều tương tự –

Các vấn đề liên quan