【问题标题】:How to print the content of a collection sequence如何打印集合序列的内容
【发布时间】:2019-06-26 12:06:37
【问题描述】:

我想打印集合的内容,我已经尝试使用 mkString 方法,但它仍然给我不正确的对象内容。

我的代码: 包 org.template

import org.apache.predictionio.controller.LServing

class Serving
  extends LServing[Query, PredictedResult] {

  override
  def serve(query: Query,
    predictedResults: Seq[PredictedResult]): PredictedResult = {

    println(predictedResults.mkString("\n"))
    predictedResults.head
  }

}

回应:

predictedResult([Lorg.template.ItemScore;@2fb3a837,[Lorg.template.Rule;@5cfc70a8)

PredictedResult 类的定义:

package org.template

import org.apache.predictionio.controller.EngineFactory
import org.apache.predictionio.controller.Engine

// Query most similar (top num) items to the given
case class Query(items: Set[String], num: Int) extends Serializable

case class PredictedResult(itemScores: Array[ItemScore], rules: Array[Rule]) extends Serializable

【问题讨论】:

  • 你能显示PredictedResult的定义吗?

标签: scala predictionio


【解决方案1】:

如果PredictedResult 是这样的案例类

  case class PredictedResult(value: String)
  val predictedResults = List(PredictedResult("aaa"), PredictedResult("bbb"))
  println(predictedResults.mkString("\n"))

然后我们得到很好的输出

PredictedResult(aaa)
PredictedResult(bbb)

但是,如果是这样的常规课程

  class PredictedResult(value: String)
  val predictedResults = List(new PredictedResult("aaa"), new PredictedResult("bbb"))
  println(predictedResults.mkString("\n"))

然后我们得到

example.Hello$PredictedResult@566776ad
example.Hello$PredictedResult@6108b2d7

为了获得常规类的良好输出,我们需要像这样覆盖它的 toString 方法

  class PredictedResult(value: String) {
    override def toString: String = s"""PredictedResult($value)"""
  }

现在输出

PredictedResult(aaa)
PredictedResult(bbb)

解决我们的评论

  case class Rule(v: String)
  case class ItemScore(v: Int)
  case class PredictedResult(itemScores: Array[ItemScore], rules: Array[Rule]) {
    override def toString: String =
      s"""
        |PredictedResult(Array(${itemScores.mkString(",")}, Array(${rules.mkString(",")}))
      """.stripMargin
  }
  val predictedResults = List(PredictedResult(Array(ItemScore(42), ItemScore(11)), Array(Rule("rule1"), Rule("rule2"))))
  println(predictedResults.mkString("\n"))

哪个输出

PredictedResult(Array(ItemScore(42),ItemScore(11), Array(Rule(rule1),Rule(rule2)))

如果我们像这样从Array 更改为List

  case class Rule(v: String)
  case class ItemScore(v: Int)
  case class PredictedResult(itemScores: List[ItemScore], rules: List[Rule])
  val predictedResults = List(PredictedResult(List(ItemScore(42), ItemScore(11)), List(Rule("rule1"), Rule("rule2"))))
  println(predictedResults.mkString("\n"))

然后我们得到很好的开箱即用输出,而无需覆盖toString

PredictedResult(List(ItemScore(42), ItemScore(11)),List(Rule(rule1), Rule(rule2)))

【讨论】:

  • 很奇怪,因为它是一个案例类:case class PredictedResult(itemScores: Array[ItemScore], rules: Array[Rule]) extends Serializable。那么我的代码应该可以工作了。
  • 我将它从数组更改为列表,它现在可以工作了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-23
  • 2012-06-08
  • 2017-09-25
  • 1970-01-01
相关资源
最近更新 更多