2014-12-02 3 views
0

Я новичок в Scala.Как заполнить объекты, определенные пользователем, из списка списков в scala

В настоящее время пытается написать программу, которая извлекает метаданные таблицы из базы данных в виде списка списков в нижнем формате и преобразует их в объекты определенного пользователем типа TableFieldMetadata.

getAllTableMetaDataAsVO функция делает это изменение.

Можете ли вы сказать мне, могу ли я лучше написать эту функцию функционально.

| **Table Name** | **FieldName** | **Data type** | 

| table xxxxxx | field yyyyyy | type zzzz | 

| table xxxxxx | field wwwww| type mmm| 

| table qqqqqq| field nnnnnn| type zzzz | 

Примечание: Здесь имя таблицы можно повторить, как это обычно имеет несколько столбцов.

Пользовательские классы: 1. TableFieldMetadata:

/** 
* Class to hold the meta data for a table 
*/ 
class TableFieldMetadata (name: String){ 
    var tableName: String = name 
    var fieldMetaDataList: List[FieldMetaData] = List() 

def add(fieldMetadata: FieldMetaData) { 
    fieldMetaDataList = fieldMetadata :: fieldMetaDataList 
} 
} 

2. FieldMetaData:

/** 
* Class to hold the meta data for a field 
*/ 
class FieldMetaData (fieldName: String, fieldsDataType: String) { 
    var name:String = fieldName 
    var dataType:String = fieldsDataType 
} 

Функция:

/** 
* Function to convert list of lists to user defined objects 
*/ 
def getAllTableMetaDataAsVO(allTableMetaData: List[List[String]]):List[TableFieldMetadata] = { 
    var currentTableName:String = null 
    var currentTable: TableFieldMetadata = null; 
    var tableFieldMetadataList: List[TableFieldMetadata] = List() 

    allTableMetaData.foreach { tableFieldMetadataItem => 
    var tableName = tableFieldMetadataItem.head 
    if (currentTableName == null || !currentTableName.equals(tableName)) { 
     currentTableName = tableName 
     currentTable = new TableFieldMetadata(tableName) 
     tableFieldMetadataList = currentTable :: tableFieldMetadataList 
    } 
    if (currentTableName.equals(tableName)) { 
     var tableField = tableFieldMetadataItem.tail 
     currentTable.add(new FieldMetaData(tableField(0), tableField(1))) 
    }  

    } 
    return tableFieldMetadataList 
} 

ответ

0

Вот одно из решений. ПРИМЕЧАНИЕ. Я просто использовал Table и Field для удобного ввода в REPL. Вы должны использовать классы case.

scala> case class Field(name: String, dType : String) 
defined class Field 

scala> case class Table(name : String, fields : List[Field]) 
defined class Table 

scala> val rawData = List(List("table1", "field1", "string"), List("table1", "field2", "int"), List("table2", "field1", "string")) 
rawData: List[List[String]] = List(List(table1, field1, string), List(table1, field2, int), List(table2, field1, string)) 

scala> val grouped = rawData.groupBy(_.head) 
grouped: scala.collection.immutable.Map[String,List[List[String]]] = Map(table1 -> List(List(table1, field1, string), List(table1, field2, int)), table2 -> List(List(table2, field1, string))) 

scala> val result = grouped.map { case(k,v) => { val fields = for { r <- v } yield { Field(r(1), r(2)) }; Table(k, fields) } } 
result: scala.collection.immutable.Iterable[Table] = List(Table(table1,List(Field(field1,string), Field(field2,int))), Table(table2,List(Field(field1,string)))) 
+0

Большое спасибо. Это то, что я ищу. – John

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