سؤال

(Scala 2.7.7 :) لا أعتاد على 2D المجرات. المصفوفات قابلة للتغيير ، ولكن كيف يمكنني تحديد راتبي ثنائي الأبعاد - دعنا نقول عن الحجم 3 × 4. يتم إصلاح البعد (2D) ، ولكن يجب أن يكون الحجم لكل بعد قابلاً للتهيئة. حاولت هذا:

class Field (val rows: Int, val cols: Int, sc: java.util.Scanner) {
 var field = new Array [Char](rows)(cols)

 for (r <- (1 to rows)) {
  val line = sc.nextLine ()
  val spl = line.split (" ")
  field (r) = spl.map (_.charAt (0))
 }

   def put (row: Int, col: Int, c: Char) =
       todo ()
}

أحصل على هذا الخطأ :: 11: خطأ: تحديث القيمة ليس عضوًا في حقل char (r) = spl.map (_.charat (0))

إذا كان هذا هو جافا ، فسيكون ذلك أكثر من ذلك الكود ، لكنني أعرف كيفية القيام بذلك ، لذلك أظهر ما أعنيه:

public class Field
{
 private char[][] field;

 public Field (int rows, int cols, java.util.Scanner sc) 
 {
  field = new char [rows][cols]; 
  for (int r = 0; r < rows; ++r) 
  {
   String line = sc.nextLine ();
   String[] spl = line.split (" ");
   for (int c = 0; c < cols; ++c)
    field [r][c] = spl[c].charAt (0);
  }
 }

 public static void main (String args[])
 {
  new Field (3, 4, new java.util.Scanner ("fraese.fld"));
 }
}

و fraese.fld سوف تبدو ، على سبيل المثال ، مثل ذلك:

M M M 
M . M 

أحصل على بعض الخطوات على نطاق واسع مع

val field = new Array [Array [Char]](rows)

لكن كيف يمكنني تنفيذ "وضع"؟ أم أن هناك طريقة أفضل لتنفيذ 2D. نعم ، يمكنني استخدام طيبة واحدة ، والعمل مع

put (y, x, c) = field (y * width + x) = c

لكنني أفضل تدوين يبدو أكثر ثنائية الأبعاد.

هل كانت مفيدة؟

المحلول

for (r <- (1 to rows)) {

يجب أن يكون هذا:

for (r <- (0 to rows - 1)) {

... تبدأ من 0 بدلا من 1؟

field (r) = spl.map (_.charAt (0))

يجب أن يستخدم هذا بناء جملة المشغل ، مثل هذا:

field (r) = spl map (_.charAt (0))

... بدون ال '.' بين SPL والخريطة؟


هذا هو الإصدار الخاص بي - لقد استبدلت الماسح الضوئي بمصفوفة [سلسلة] لأنني لست متأكدًا حقًا من إدخال الماسح الضوئي. يجمع ويدير على Scala 2.7.5:

class Field (val rows: Int, val cols: Int, lines: Array[String]) {
    var field = new Array [Array[Char]](rows)

    // These get replaced later on, but this is how to initialize a 2D array.
    for (i <- (0 to rows - 1)) {
        field(i) = new Array[Char](cols)
    }

    for (r <- (0 to rows - 1)) {
        val line = lines(r)
        val spl = line.split (" ")
        field(r) = spl map (_.charAt (0))
    }
}

var lines = Array[String] ("A A A A A", "B B B B B", "C C C C C", "D D D D D", "E E E E E")
var test  = new Field(5, 5, lines)
test.field
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top