2013-02-19 40 views
15

कैसे मैं एक base36 करने के लिए लंबे समय परिवर्तित कर सकते हैं? आपके उत्तर के साथ समझाया जा सकता है कि आप उत्तर में कैसे आए?स्केला में 36 आधार करने के लिए एक लंबे समय से कन्वर्ट

मैं एक अलग आधार को परिवर्तित करने के लिए scaladocs for Long देख लिया है, और एक BigInt करने के लिए एक लंबे समय परिवर्तित करने पर। मैंने देखा कि BigInt में toString(base) है इसलिए एक समाधान में प्रकार को बदलने में शामिल हो सकता है, लेकिन मैं यह नहीं समझ पाया कि कैसे।

नोट: मैं स्केला/जावा/प्रकार- सुरक्षित भाषाओं के लिए नए इसलिए मैं कुछ तुच्छ अनदेखी हो सकता हूँ।

उत्तर

23

कक्षा java.lang.Long की एक स्थैतिक विधि है जो स्ट्रिंग (लम्बाई, इंट रेडिक्स) है जो एक लंबे आधार को एक और आधार के स्ट्रिंग प्रस्तुति में परिवर्तित कर देगी। "रेडिक्स" का अर्थ इस संदर्भ में "आधार" जैसा ही है।

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

स्काला, एक java.lang.Long जब आवश्यक के रूप में अपने स्केला लांग मूल्य का इलाज ताकि आप हमेशा जावा API दस्तावेज़ों में तरीकों के लिए देख सकते जब आवश्यक होगा। देखें: http://docs.oracle.com/javase/6/docs/api/java/lang/Long.html

+1

तो क्या आपको पता था कि आपको जावा के लांग जाना है? मैं बिना किसी जावा अनुभव के स्कैला में जाने की कोशिश कर रहा हूं और मुझे लगता है कि मुझे नहीं पता कि कभी-कभी जवाब कहां मिलते हैं ... यहां मैं क्या समाप्त कर रहा हूं: 'डीफ़ हैशर (आईडी: लांग): स्ट्रिंग = { java.lang.Long.toString (आईडी, 36) } ' धन्यवाद जोश! – AKnox

+1

@AKnox - जावास्क्रिप्ट की बजाय बहुत सारी कार्यक्षमता जावा से है; यह हमेशा प्रासंगिक वर्ग की जांच करने का भुगतान करता है (यदि कोई है तो)। इसके अलावा, यह एक हैशिंग फ़ंक्शन के लिए एकवचन रूप से खराब विकल्प जैसा प्रतीत होता है, लेकिन हो सकता है कि आप "हैश" द्वारा गैर मानक मानें। –

+0

क्या आप जानते हैं कि विपरीत करने का कोई तरीका है या नहीं? आधार एन से एक लंबे समय तक पढ़ें? –

5

ठीक है, या तो विधि स्कैला के Long या इसकी वृद्धि कक्षा, RichLong पर उपलब्ध है, या आपको जावा समकक्ष पर इसकी खोज करनी होगी। उत्तरार्द्ध मामला होता है।

यह स्रोत प्रकार या गंतव्य प्रकार पर हो सकता है, और long जावा में कोई कक्षा नहीं है, तो आपको इसे java.lang.Long पर देखना होगा। यह String पर नहीं है - Long लेने के तरीकों के लिए देखो -, लेकिन आप java.lang.Long पर इसे पा सकते हैं, बस उस पर String लौटने के तरीकों की तलाश में। स्काला भाषा भीतर

+0

मुझे अपने आप को समस्याओं को हल करने के लिए प्रक्रिया को कम करने में मदद करने के लिए समय निकालने के लिए धन्यवाद, बहुत बाध्य। – AKnox

38

रहकर, एक BigInt को Long परिवर्तित पता चला है सरल होने के लिए:

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

उत्पादन किया जा रहा है:

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

वे जिस तरह से मैं विषय के लिए आया था एक जावा डेवलपर और स्काला के रूप में था शुरुआती ("Impatient.pdf के लिए स्कैला" का अध्याय 1 पढ़ना)। उपरोक्त उत्तरों काम किया लेकिन अजीब लग रहा था। इस तरह के एक बुनियादी रूपांतरण के लिए जावा भूमि में कूदने के लिए किसी भी तरह से कम सही लग रहा था, खासकर जब BigInt में सभी चीजें थीं। स्कालाडोक और उपरोक्त उत्तरों की समीक्षा करने के बाद, कुछ विफल हो गए।

मेरी सबसे बड़ी विफलता toInt() का उपयोग कर रही थी जो myLong को डरावनी रूप से छीनती है। छोड़ने के बारे में, अंतिम प्रयास इतना आसान और सहज महसूस हुआ कि मैंने लगभग इसे आजमाया नहीं: myBigInt = myLong। शायद एक दिन Long समृद्ध होगा और toBigInt समझ जाएगा ... यह मेरी पहली यात्रा में असफल रहा।

+1

यह एक बेहतर जवाब है। Thnx – Ward

+1

यह बेहतर होगा अगर यह var –

+0

हानिकारक के बजाय वैल का उपयोग करता है! ऐसा नहीं लगता था कि 'toString' का एक संस्करण है जो रेडिक्स को पैरामीटर के रूप में ले जाएगा। धन्यवाद! – asgs

-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 
8

तो तुम BigInt को लांग परिवर्तित करना चाहते हैं। BigInt ऑब्जेक्ट में एक लागू विधि है जो पैरामीटर के रूप में लंबे समय तक लेती है। आरईपीएल में एक उदाहरण दिया गया है।

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