20

Long を base36 に変換するにはどうすればよいですか? あなたの答えとともに、あなたがどのように答えに至ったのかを説明できますか?

別のベースに変換するため、およびLong を BigInt に変換するために、Long の scaladocs を確認しました。BigIntにはtoString( base )型の変更が含まれている可能性があるため、解決策があることがわかりましたが、その方法がわかりませんでした。

注: 私は scala / java / タイプセーフ言語を初めて使用するので、些細なことを見落としている可能性があります。

4

5 に答える 5

42

Scala 言語にとどまりLong、 a への変換BigIntは簡単であることがわかります。

var myLong : Long = Long.MaxValue
var myBigInt : BigInt = myLong
myBigInt.toString(36)

出力は次のとおりです。

myLong: Long = 9223372036854775807
myBigInt: scala.math.BigInt = 9223372036854775807
res199: String = 1y2p0ij32e8e7

私がこのトピックにたどり着いたのは、Java 開発者であり、Scala の初心者であった (「Scala for the Impatient.pdf」の第 1 章を読んだ) ことでした。上記の答えはうまくいきましたが、奇妙に思えました。このような基本的な変換のために Java の世界に飛び込まなければならないことは、特にBigIntすべてのものを持っている場合には、あまり正しくないように思えました。scaladoc と上記の回答を確認した後、いくつかの失敗が続きました。

私の最大の失敗は、ひどくtoInt()切り捨てられるものを使用することmyLongでした。あきらめそうになったとき、最後の試みは非常に単純で直感的であるように思えたので、ほとんど試しませんでした: myBigInt = myLong. いつかLongはもっと豊かに理解できる日が来るのだろうかtoBigInt… これが旅の最初の失敗でした。

于 2013-03-24T19:23:48.727 に答える
28

クラス java.lang.Long には、Long を別のベースの文字列表現に変換する静的メソッド toString(long i, int radix) があります。このコンテキストでは、「基数」は「基数」と同じ意味です。

val myLong = 25000L
val longInBase36:String = java.lang.Long.toString(myLong, 36)

Scala は、必要に応じて scala の Long 値を java.lang.Long として処理するため、必要に応じていつでも Java API ドキュメントでメソッドを探すことができます。参照: http://docs.oracle.com/javase/6/docs/api/java/lang/Long.html

于 2013-02-19T04:27:03.410 に答える
8

したがって、Long を BigInt に変換します。BigInt オブジェクトには、パラメーターとして Long を取る apply メソッドがあります。以下は REPL の例です。

scala> BigInt(458982948578L).toString(36)
res11: String = 5uuqlhpe
于 2015-04-19T07:58:10.450 に答える
5

メソッドが ScalaLongまたはその拡張クラスで利用できるか、RichLong対応する Java で検索する必要があります。後者はたまたまそうです。

ソース型または宛先型のいずれかである可能性がありlong、 Java のクラスではないため、 で探す必要がありますjava.lang.Long。それは on ではありませんString-- 取っているメソッドを探してください -- しかし、それを返すメソッドを探すだけで、 Longon で見つけることができます。java.lang.LongString

于 2013-02-19T04:43:23.103 に答える
-1

一般形

def nextInt(d: Double): Int = if (math.floor(d) == d) d.toInt + 1 else math.ceil(d).toInt

def digitsL(base: Int, n: Long, padTo: Int = 0): List[Int] =
  List.fill(List(padTo, nextInt(math.log(n) / math.log(base))).max - 1)()
  .foldLeft((List((n % base).toInt), base)) {
    case ((cum, div), _) => (((n / div) % base).toInt +: cum, div * base)
  }._1

(そしてその逆)

def digitsToLong(base: Int, digits: List[Int]): Long = digits.foldRight((0L, 1)){
  case (cur, (cum, pow)) => (cum + cur.toLong * pow, pow * base)
}._1
于 2014-03-06T12:43:51.610 に答える