如何从scala中的列表列表填充用户定义的对象
我是斯卡拉的新手 当前正在尝试编写一个程序,以以下格式从数据库中获取表元数据作为列表列表,并将其转换为用户定义类型的对象如何从scala中的列表列表填充用户定义的对象,scala,Scala,我是斯卡拉的新手 当前正在尝试编写一个程序,以以下格式从数据库中获取表元数据作为列表列表,并将其转换为用户定义类型的对象TableFieldMetadata 函数执行此转换 你能告诉我,我是否能用函数的方式更好地编写这个函数吗 | **Table Name** | **FieldName** | **Data type** | | table xxxxxx | field yyyyyy | type zzzz | | table xxxxxx | field wwwww| type m
TableFieldMetadata
函数执行此转换
你能告诉我,我是否能用函数的方式更好地编写这个函数吗
| **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
}
}
二,。字段元数据:/**
* 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
}
这里有一个解决方案。注意:我刚才使用了
表
和字段
,以便于在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))))
scala>案例类字段(名称:String,数据类型:String)
定义类字段
scala>案例类表(名称:字符串,字段:列表[字段])
定义类表
scala>val rawData=List(List(“table1”、“field1”、“string”)、List(“table1”、“field2”、“int”)、List(“table2”、“field1”、“string”))
rawData:List[List[String]=List(List(表1,字段1,字符串),List(表1,字段2,int),List(表2,字段1,字符串))
scala>val grouped=rawData.groupBy(u.head)
分组: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非常感谢。这是我正在寻找的东西。