2013-02-19 15 views
15

Jak przekonwertować długą na podstawową36? Wraz z odpowiedzią możesz wyjaśnić, w jaki sposób doszedłeś do odpowiedzi?Konwersja długiej na podstawową 36 w scala

Sprawdziłem, czy scaladocs for Long przekształca się w inną bazę, i po konwersji długiego na BigInt. Zobaczyłem, że BigInt ma toString(base), więc rozwiązanie może wymagać zmiany typu, ale nie mogłem dowiedzieć się, jak.

Uwaga: Jestem nowy w językach scala/java/type-safe, więc mogłem przeoczyć coś trywialnego.

Odpowiedz

23

Klasa java.lang.Long ma statyczną metodę toString (long i, int radix), która przekształci Long na ciąg reprezentujący inną bazę. "Radix" oznacza w tym kontekście to samo co "baza".

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

Scala będzie traktować scala Długi wartość jako java.lang.Long razie potrzeby, więc zawsze można poszukać metod w dokumentacji API Javy, gdy jest to konieczne. Zobacz: http://docs.oracle.com/javase/6/docs/api/java/lang/Long.html

+1

Po prostu wiedziałeś, że musisz iść do Long? Próbuję dostać się do scala bez doświadczenia java i mam wrażenie, że nie wiem, gdzie znaleźć odpowiedzi czasami ... Oto co otrzymałem: 'def hasher (id: Long): String = { java.lang.Long.toString (id, 36) } ' Dziękuję Josh! – AKnox

+1

@AKnox - Wiele funkcji pochodzi z Java, a nie z replikacji; zawsze warto sprawdzić tam również odpowiednią klasę (jeśli taka istnieje). Co więcej, wydaje się to być wyjątkowo złym wyborem dla funkcji mieszania, ale może masz na myśli coś niestandardowego przez "hash". –

+0

Czy wiesz, czy istnieje sposób, aby zrobić coś przeciwnego? Czytanie z bazy n do długiego? –

5

Cóż, albo metoda jest dostępna na Scala w Long lub jej klasie poprawy, RichLong, lub musisz szukać go w odpowiedniku Java. Ta druga sytuacja ma miejsce.

Może to być typ źródłowy lub docelowy, a ponieważ long nie jest klasą w Javie, należy go wyszukać pod adresem java.lang.Long. Nie ma go na String - szukaj metod pobierających Long - ale możesz go znaleźć na java.lang.Long, szukając tylko metod zwracających String.

+0

Dziękuję za poświęcenie czasu, aby pomóc mi przygwoździć proces rozwiązywania problemów na własną rękę, bardzo zobowiązany. – AKnox

38

Pozostawanie w języku Scala, konwersja Long do BigInt okazuje się być prosta:

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

wyjście jest:

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

one sposób doszedłem do tematu był jako programista Java i Scala początkujący (czytając rozdział 1 "Scala for the Impatient.pdf"). Powyższe odpowiedzi zadziałały, ale wydawały się dziwne. Konieczność wskoczenia do ziemi Javy na taką podstawową konwersję wydawała się mniej poprawna, szczególnie gdy BigInt miał wszystkie rzeczy. Po zapoznaniu się ze skaladoc i odpowiedziami powyżej, nastąpiło kilka niepowodzeń.

Mój największy niepowodzenie polegało na tym, że użyłem toInt(), który straszliwie obciął myLong. Poddać się, ostatnia próba wydawała się tak prosta i intuicyjna, że ​​prawie jej nie wypróbowałem: myBigInt = myLong. Być może pewnego dnia Long będzie bogatszy i zrozumiem toBigInt ... to był mój pierwszy niepowodzenie w podróży.

+1

To jest lepsza odpowiedź. Thnx – Ward

+1

Byłoby jeszcze lepiej, gdyby użył val zamiast var –

+0

cholera! Nie sądziłem, że istnieje wariant 'toString', który użyłby radix jako parametru. Dzięki! – asgs

-1

forma Ogólne

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 

(i na odwrót)

def digitsToLong(base: Int, digits: List[Int]): Long = digits.foldRight((0L, 1)){ 
    case (cur, (cum, pow)) => (cum + cur.toLong * pow, pow * base) 
}._1 
8

Więc chcesz przekonwertować do BigInt długi. Obiekt BigInt ma metodę apply, która przyjmuje Long jako parametr. Oto przykład w REPL.

scala> BigInt(458982948578L).toString(36) 
res11: String = 5uuqlhpe 
Powiązane problemy