2016-04-20 5 views
0

Ich stecke auf diesem Teil meines Codes fest. Ich habe eine Zeichenfolge, die in der Eingabe gespeichert ist.Wie würden Sie eine Zeichenfolge von Long Integer in BigInteger konvertieren?

String input = ("831346848 2162638190 2014846560 1070589609 326439737"); 

Die Zeichenfolge enthält lange ganze Zahlen. Ich versuche, sie zu implementieren, indem ich jede lange Ganzzahl in einen BigInteger umwandle. Zum Beispiel aus der Zeichenfolge, muss ich Folgendes tun:

BigInteger bi1= new BigInteger("831346848"); 

und so weiter. Die Eingabe-Zeichenfolge ist extrem lang, also muss ich das in eine Art Schleife legen. nachdem ich es vorübergehend in bi1 gespeichert habe, muss ich ein b1.modPow (exp, mod) ausführen. Wiederholen Sie dann die Schritte für jede lange ganze Zahl in der Zeichenfolge. Den Teil, den ich verstehe, aber der Teil, auf dem ich verwirrt bin, ist, wie man den Eingabe-String in eine Schleife legt, damit er in bi1 gespeichert wird.

Die langen Ganzzahlen sind durch ein Leerzeichen getrennt und jede lange Ganzzahl in der Zeichenfolge hat unterschiedliche Längen.

Was ist der beste Weg, dies zu implementieren?

+1

Wie groß von einem String reden wir hier? Kann es in einem String-Objekt gespeichert werden oder arbeiten Sie mit einer riesigen Datei? –

+0

es ist keine große Zeichenfolge, enthält nur etwa 100 lange Ganzzahlen. –

Antwort

1

versuchen

String nums [] = input.split (" "); 
for (String num : nums) { 
    BigInteger bi1= new BigInteger(num); 
    // do whatever 
} 
5

Split die Zeichenfolge von space und speichern sie in einem List von BigInteger

String input = "831346848 2162638190 2014846560 1070589609 326439737"; 

List<BigInteger> bigIntegerList = new ArrayList<BigInteger>(); 

for(String value : input.split("\\s")){ 
    bigIntegerList.add(new BigInteger(value)); 
} 
+2

Danke für die schnelle Antwort und das funktioniert super! Wusste nicht, warum ich nicht daran gedacht habe! –

+0

Verwenden Sie \\ s anstelle von \ s. Sie können das Zeichen "+" in "\ s +" vermeiden, wenn nur ein Leerzeichen vorhanden ist, wenn Sie möchten, aber es ist nicht notwendig. – KJEjava48

1
BigInteger bi1; 
for (String sbigint : input.split(" ")) { 
    BigInteger b1 = new BigInteger(sbigint); 
    bi1 = b1.modPow(exp, mod); 
} 

Das Problem, das Sie etwas fehlt scheint beschrieben, ist die Art und Weise ist es bi1 wird enthält das Ergebnis modPow für die letzte lange Ganzzahl in Ihrer Zeichenfolge.

5

Die Java-8-Wege-

List<BigInteger> bigIntegers = Stream.of(input.split(" ")) 
    .map(BigInteger::new) 
    .map(bi -> bi.modPow(exp, bi)) 
    .collect(Collectors.toList()); 
+1

Sie könnten auch '.map (BigInteger :: new)' +1 –

0

Sie benötigen einen regulären Ausdruck wie "\ s +", was bedeutet: Split, wenn mindestens ein Leerzeichen auftritt. Der vollständige Java-Code ist:

try { 
    List<BigInteger> bigList = new ArrayList<BigInteger>(); 
    for(String subStr : input.split("\\s+")){ 
     bigList.add(new BigInteger(subStr)); 
    } 
} catch (Exception ex) { 
    // 
} 

Sie können die ‚+‘ Zeichen in vermeiden „\ s +“, wenn nur ein Raum ist es, wenn Sie mögen, aber es ist nicht notwendig.

+0

Ich würde 'Exception' nicht fangen, es sei denn, es gab einen klaren Zweck dabei. –

+0

Weil der Konstruktor eine 'NumberFormatException' auslösen kann? Eigentlich würde ich die try-catch nur innerhalb der Schleife verwenden, so dass die Ausnahme nur die störende Zeichenfolge überspringen und den Rest der Schleife fortsetzen würde. – samiunn