by shigemk2

当面は技術的なことしか書かない

StringBufferで最後の文字を切る

stackoverflow.com

scala> val a = new StringBuffer
a: StringBuffer =

scala> a.append("hoge").deleteCharAt(a.length() - 1)
res4: StringBuffer = hog

こういう感じです。deleteCharAtを使う。dropRightは使えません。

こういうふうにしたらいけるけど。

scala> a.append("hoge").toString.dropRight(1)
res5: String = hoghog

ソースコードをちょっと追っかけましたが、java.lang.StringBufferでJavaの遺産のようです。

Scalaでパディングのようなものをする

stackoverflow.com

scala> val a = 4
a: Int = 4

scala> f"${a}%04d"
res0: String = 0004

こんな感じ。2.10からの技。

文字列リテラルの先頭に f を追加することで、他の言語での printf のような簡単な書式付き文字列を作ることができる。f 補間子を使った場合は、全ての変数参照は %d のように printf 形式の書式を指定する必要がある。

文字列の補間 - Scala Documentation

Scala Mapで指定した名前のキーとその値を除外する

こういうのがあったとして

scala> val map = Map("id" -> 1, "date" -> "2015/11/01", "name" -> "Leprechaun", "weight" -> "9", "name2" -> "LOB")
map: scala.collection.immutable.Map[String,Any] = Map(weight -> 9, name -> Leprechaun, name2 -> LOB, id -> 1, date -> 2015/11/01)

キーの名前id date name以外のものだけ残したい。完成品のイメージ。

Map(weight -> 9, name2 -> LOB)

除外したい名前のリストなどを用意して、filterKeysとcontainsの合わせ技で除外するのが良いかと。

scala> val keys = Set("id", "date", "name")
keys: scala.collection.immutable.Set[String] = Set(id, date, name)
scala> map.filterKeys(!keys.contains(_))
res4: scala.collection.immutable.Map[String,Any] = Map(weight -> 9, name2 -> LOB)