【问题标题】:How to compare the objects in 2 vectors in scala如何在scala中比较2个向量中的对象
【发布时间】:2020-08-25 06:35:10
【问题描述】:

我用以下数据定义了 2 个向量: vector1 和 vector2 被定义为 Vector[Person] ,其中一个人可以同时拥有学生和教师记录。

val v1 = """[
   {
      "category":"common",
      "type":"student",
      "roles":[
         {
            "name":"A",
            "type":"Type1"
         },
         {
            "name":"B",
            "type":"Type1"
         },
         {
            "name":"C",
            "type":"Type2"
         },
         {
            "name":"D",
            "type":"Type2"
         }
      ]
   }
]"""

val v2 = """[
   {
      "category":"common",
      "type":"student",
      "roles":[
         {
            "name":"A",
            "type":"Type1"
         },
         {
            "name":"B",
            "type":"Type1"
         },
         {
            "name":"C",
            "type":"Type2"
         },
         {
            "name":"D",
            "type":"Type2"
         }
      ]
   },
   {
      "type":"Teacher",
      "roles":[
         {
            "name":"AB",
            "type":"Type1"
         },
         {
            "name":"BC",
            "type":"Type1"
         },
         {
            "name":"CD",
            "type":"Type2"
         },
         {
            "name":"DE",
            "type":"Type2"
         }
      ]
   }
]"""

我需要根据属性(即类型)比较这两个向量。该值可以是学生或教师。如果类型相同,那么我应该检查角色。

我尝试使用 zipwithindex/indices,但看起来只比较了该索引中的元素。有没有一种方法可以根据向量中每个元素的类型进行比较。如果类型和角色相同,我想声明两个向量相等。

注意:上面的例子是jsons,我们将它们读入到我们的case类中

  case class Person(
      category: String,
      name: Option[String],
      `type`: Option[String],
      roles: List[Role]
  )

  case class Role(name: String, `type`: String)

和vector1/vector2被读作Vector[Person]

【问题讨论】:

  • 那些是 jsons 而不是 scala 对象,您能否扩展您的问题,即如何将它们用作胜利者?另外,您能否更准确地了解您的预期输出和您尝试过的内容?
  • 不过,你的问题还不清楚,你想做什么?什么是预期的输出?向我们展示您尝试过的代码。

标签: scala scala-collections


【解决方案1】:

当您创建一个案例类时,它实现了一堆方法,其中一个是“equals”方法。这意味着案例类的实例不是通过引用进行比较,而是通过结构进行比较('equals' 方法只是比较所有属性)。当您只想比较某些属性而忽略其他属性时,您可以尝试覆盖 'equals' 方法(您可以使用简单的 == 运算符进行比较),但我不推荐它。这会使您的代码混乱,因为“equal”函数无法按预期工作。

为此,我建议编写一个简单的比较函数。 如果向量具有不同的大小,则它们不能相等。否则,您需要“类型”和“角色”属性相同。 Role 是一个 case 类,它的 equal 方法完全按照我们的需要工作,所以 == 运算符做得很好。

def personVectorsEqual(vec1 : Vector[Person], vec2 : Vector[Person]): Boolean ={
      if(vec1.size != vec2.size)
        false
      else (vec1, vec2).zipped.forall((p1, p2) => p1.`type` == p2.`type` && p1.roles == p2.roles)
}

Zipped 方法创建一系列对象的元组,这些对象位于相应的索引上。我们需要比较元组中的对象。由于 zipped 方法会丢弃较长序列的最后一个元素(当它们的大小不相等时),我们需要明确询问向量的大小。

注意:请注意,您真的要通过 Option 属性来比较对象吗?如果只有两种类型(“学生”和“教师”),那么不使用字符串会更清楚。也许尝试看看枚举或密封的特征/类。 此外,您的一个 json Persons 错过了强制性的“类别”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 2021-05-02
    相关资源
    最近更新 更多