更新时间:2022-03-15 21:41:04
这可能可以清除,但它可以工作并处理嵌套的StructType:
This can probably be cleaned up, but it works and handles nested StructType:
def isEqual(struct1: StructType, struct2: StructType): Boolean = {
struct1.headOption match {
case Some(field) => {
if(field.dataType.typeName != "struct") {
struct2.find(_ == field) match {
case Some(matchedField) => isEqual(StructType(struct1.filterNot(_ == field)), StructType(struct2.filterNot(_ == field)))
case None => false
}
} else {
val isEqualContents = struct2.find(x => x.name == field.name && x.nullable == field.nullable && x.dataType.typeName == "struct") match {
case Some(matchedField) => isEqual(field.dataType.asInstanceOf[StructType], matchedField.dataType.asInstanceOf[StructType])
case None => false
}
if(isEqualContents) isEqual(StructType(struct1.filterNot(_ == field)), StructType(struct2.filterNot(_ == field))) else false
}
}
case None => struct2.size == 0
}
}
val st1 = StructType(
StructField("ii",StringType,true) ::
StructField("i",StringType,true) ::
StructField("iii", StructType(StructField("iv", StringType, true) :: Nil), true) :: Nil)
val st2 = StructType(
StructField("i",StringType,true) ::
StructField("ii",StringType,true) ::
StructField("iii", StructType(StructField("v", StringType, true) :: Nil), true) :: Nil)
isEqual(st1, st2)
它也可以使用更多的爱来成为尾递归.
It could also use a little more love to become tail recursive, too.