如何从scala中的列表列表填充用户定义的对象

时间:2014-12-02 12:10:48

标签: 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
}

1 个答案:

答案 0 :(得分:0)

这是一个解决方案。注意:我刚使用TableField来轻松输入REPL。您应该使用案例类。

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))))