Scala - как отформатировать коллекцию в строку? - PullRequest
1 голос
/ 30 сентября 2019

Я пытаюсь проанализировать данные метрик в форматированную строку, чтобы в ней был заголовок, а каждая запись ниже начиналась с новой строки. Сначала я хотел получить что-то близкое к форматированию таблицы, например:

Id | Name  | Rate | Value
1L | Name1 | 1    | value_1
2L | Name2 | 2    | value_2
3L | Name3 | 3    | value_3

Но моя текущая реализация приводит к следующей ошибке:

java.util.MissingFormatArgumentException: спецификатор формата'% -70s'

Что я должен изменить в своем коде, чтобы правильно отформатировать его?

import spark.implicits._
import org.apache.spark.sql.types._
import org.apache.spark.sql.functions._

case class BaseMetric(val id: Long,
                     val name: String,
                     val rate: String,
                     val value: String,
                     val count: Long, 
                     val isValid: Boolean
) { 

   def makeCustomMetric: String = Seq(id, name, rate, value).mkString("\t")

}

val metric1 = new BaseMetric(1L, "Name1", "1", "value_1", 10L, true)
val metric2 = new BaseMetric(2L, "Name2", "2", "value_2", 20L, false)
val metric3 = new BaseMetric(3L, "Name3", "3", "value_3", 30L, true)

val metrics = Seq(metric1, metric1, metric1)



def formatMetrics(metrics: Seq[BaseMetric]): String = {
    val pattern = "%-50s | %-70s | %-55s | %-65s | %f"

    val formattedMetrics: String = pattern.format(metrics.map(_.makeCustomMetric))
      .mkString("Id | Name | Rate | Value\n", "\n", "\nId | Name | Rate | Value")
    formattedMetrics

  }

val metricsString = formatMetrics(metrics)

Ответы [ 2 ]

2 голосов
/ 30 сентября 2019

Конкретная ошибка связана с тем, что вы передаете Seq [String] в формат, который ожидает Any *. Вы передаете только один параметр вместо пяти. Ошибка говорит, что не находит аргумента для вашей второй строки формата.

Вы хотите применить шаблон к каждой метрике, а не ко всем метрикам в шаблоне. Заполнения в строке формата слишком велики для того, чего вы хотите достичь.

    val pattern = "%-2s | %-5s | %-4s | %-6s"
    metrics.map(m => pattern.format(m.makeCustomMetric: _*))
      .mkString("Id | Name  | Rate | Value\n", "\n", "\nId | Name  | Rate | Value")

_* сообщает компилятору, что вы хотите передать список в качестве аргумента переменной длины. makeCustomMetric должен возвращать только список, а не строку.

def makeCustomMetric: String = Seq(id, name, rate, value)
1 голос
/ 30 сентября 2019

Интерполяция строк Scala - это оптимизированный способ объединения строк. Ссылка: https://docs.scala -lang.org / Overviews / core / string-interpolation.html

s"id: $id ,name: $name ,rate: $rate ,value: $value ,count: $count, isValid: $isValid"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...