2013-10-01 2 views
0

Я сделал «mkString», но все еще не могу распечатать список строк. С входной линии:Scala: невозможно распечатать элементы списка

9002194187,2644,54,100,3,4,2,5 

я получаю следующий результат:

Line: 9002194187,2644,54,100,3,4,2,5 
StrArr: 9002194187,2644,54,100,3,4,2,5 
Lst: [Ljava.lang.String;@223d2e6c 
Lst again: List([Ljava.lang.String;@223d2e6c) 
Lst1: [Ljava.lang.String;@223d2e6c 
Result: foo 

Из кода ниже:

def mkRecord(line: String) : String = { 
    val klass = "foo" 
    val strArr = line.split(",") // convert string to array of strings 
    println("Line: "+line) 
    println("StrArr: "+strArr.mkString(",")) 
    val lst = List(strArr) 
    println("Lst: "+lst.mkString(" - ")) 
    println("Lst again: "+lst) 
    val lst1 = lst.tail ++ List(klass) // attribute list except for the first one, plus new klass attribute 
    println("Lst1: "+lst.mkString(" , ")) 
    val result = lst1.mkString(",") // attribute string 
    println("Result: "+ result) 
    return result 
    } 

Пожалуйста, помогите. Я в полной потери (

ответ

2

Конструктор List (собственно, метод объекта списка компаньона применения) принимает параметры в виде в Scala «переменной длины» эквивалент:

def apply[A](xs: A*): List[A] // some irrelevant details have been elided 

В Java, это будет быть написано что-то вроде:

public static List<A> apply(A... args) 

в Скале это может быть вызван с использованием любого Seq (или подкласс), но с использованием специального обозначения линия вы использовали:.

val lst = List(strArr) 

создает List[Array[String]], с одной записью - массив strArr. Для того, чтобы сообщить компилятору, чтобы превратить массив в списки параметров при передаче его в метод Списка apply, добавьте : _* на конце (пространство не является обязательным):

val lst = List(strArr: _*) 

Это изменение в коде приведет:

scala> mkRecord(chkStr) 
Line: 9002194187,2644,54,100,3,4,2,5 
StrArr: 9002194187,2644,54,100,3,4,2,5 
Lst: 9002194187 - 2644 - 54 - 100 - 3 - 4 - 2 - 5 
Lst again: List(9002194187, 2644, 54, 100, 3, 4, 2, 5) 
Lst1: 9002194187 , 2644 , 54 , 100 , 3 , 4 , 2 , 5 
Result: 2644,54,100,3,4,2,5,foo 
res1: String = 2644,54,100,3,4,2,5,foo 
+0

Где бы остановиться: "* _" Оператор Scala? Большое спасибо за подробную информацию! –

+0

Поиск терминов типа «scala varargs», вы должны поражать страницы, такие как [этот] (http://daily-scala.blogspot.com.au/2009/11/varargs.html) – Shadowlands

+0

@AntonAshanin в примере Shadowlands , подчеркивание предоставляет тип записи, что не так хорошо документировано на большинстве страниц, описывающих различные применения подчеркивания. http://docs.scala-lang.org/style/types.html – itsbruce

0

Вы можете превратить любой массив в список с помощью своего оператора toList, избегая этой проблемы (характер которой объяснил Shadowlands). Вы можете сделать строку -> массив -> список в одной строке:

line.split(',').toList 

Использование toList метод тематической подборки часто будет быстрее, чем извлечение всех элементов в последовательности, а затем преобразовать эту последовательность в список, не по крайней мере потому, что вы будете использовать метод, оптимизированный для коллекции источников. Тем не менее, это оптимизация, о которой вы можете беспокоиться о после приоритетами успеха и ясности.

+1

Стоит отметить, что с Scala 2.10, .toList и все многие многие подобные функции преобразования коллекции объединяют свои функции в ".to ». В вашем примере может быть написано line.split (','). [Список] –

Смежные вопросы