2014-12-02 1 views
0

스칼라를 처음 사용했습니다.스칼라 목록 목록에서 사용자 정의 개체 채우기 방법

현재 데이터베이스의 테이블 메타 데이터를 아래 목록의 목록으로 가져 와서 사용자 정의 유형 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

여기 하나의 해결책이 있습니다. 참고 : REPL에 쉽게 입력하기 위해 TableField을 사용했습니다. 사례 클래스를 사용해야합니다.

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

관련 문제