Как распечатать содержимое последовательности коллекции - PullRequest
1 голос
/ 26 июня 2019

Я хочу напечатать содержимое коллекции, и я попытался с помощью метода mkString, но он по-прежнему не дает мне нужного содержимого объекта.

Мой код: пакет орг.темплат

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

1 Ответ

3 голосов
/ 26 июня 2019

Если 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)))
...