2017-03-02 5 views
1

I Array von String haben, die wie folgt aussieht:STRING: ersetzen Muster mit formatierten Zahl

someThing/one_text_0000_temperature**** 
another/two_text_0000_temperature**** 
where/three_text_0000_temperature**** 

I variable Schritt haben.

int step 

Ich brauche diese **** mit der Nummer in der Variablen Schritt zu ersetzen.

Ausgabebeispiel, wenn Schritt 94:

someThing/one_text_0000_temperature0094 
another/two_text_0000_temperature0094 
where/three_text_0000_temperature0094 

Problem ist, dass einige * ändert. Nun, wenn das Programm läuft, ist es für jede Zeichenkette konstant und gleich. Aber diese Zeichenfolgen stammen aus der Datei. Anzahl von * kann beim nächsten Programmstart anders sein, Datei hat sich geändert.

denke ich, dass ich das in 3 Schritten tun: Finden Sie Anzahl der Sterne, das Format Schritt in String und finaly Teil der Zeichenfolge mit neuem String

Frage 1) ersetzen wie Anzahl der Sterne, um herauszufinden?

Frage 2) Wie Schritt Variable in dynamische Länge Zeichenfolge formatieren? Nicht wie folgt aus:

String.format("%04d", step); // how to change that 4 if needed? 

Frage 3) wie durch eine andere Zeichenfolge
Teil der Zeichenfolge ersetzen Diese durch den Aufruf ersetzen getan werden könnte. Nicht sicher, ob line = line.replace() effizient/korrekt ist?

String line = new String("someThing/one_text_0000_temperature****"); 
String stars = new String("****"); // as result of step 1 
String stepString = new String("0094"); // as result of step 2 
line = line.replace(stars, stepString); 

Vielen Dank für Tipps/

Edited für Inspiration

Danke helfen. Ich habe einige weitere Ideen, die hier Simple way to repeat a String in java und meine letzte Code:

int kolko = line.length() - line.indexOf("*"); 
String stars = String.format("%0"+kolko+"d", 0).replace("0", "*"); 
String stepString = String.format("%0"+kolko+"d", step); 

I Linien in HashMap gespeichert haben, so kann ich verwendet Lambda

lines.replaceAll((k, v) -> v.replace(stars, stepString)); 
+1

wenn Sterne am Ende nur vorhanden sind Ihrer 'line', können Sie ihre Anzahl berechnen:' int starIndex = line.indexOf ("*"); int numberOfStars = line.length() - line_string (starIndex) .length(); 'Die Methode' indexOf (String str) 'gibt das erste Vorkommen eines Zeichens/einer Zeichenkette in der Zeichenkette zurück. – peech

Antwort

0

i try this:

String test = "test****"; //test: "test****" 
int one = test.indexOf("*"); //one: 4 
int two = test.lastIndexOf("*"); //two: 7 
int nb = two-one; //nb: 3 two: 7 one: 4 

String newTest= test.replace("*","0"); //newTest: "test0000" 
String step = "12"; //step: "12" 
newTest = newTest.substring(0,newTest.length()-step.length()); //newTest: "test00" 
newTest += step; //newTest: "test001" 

Sie kann auch eine Größenprüfung zwischen 'nb' und 'step.length()' hinzufügen. Wenn step.length() größer als Ihre Nummer oder '*' ist, was tun Sie?

1

Versuchen Sie zuerst, einen String mit '0' vorzufüllen, fügen Sie am Ende Ihre magische Zahl hinzu. Dann funktioniert einfach ein Teilstring, da du weißt, wie lang dein '*' ist und wo es beginnt.

Dies funktioniert auch:

String s1 = "someThing/one_text_0000_temperature****"; 
    String step = "94"; 
    String v = "0000000000" + step; 
    String result = s1.substring(0, s1.indexOf('*')) + v.substring(v.length() - s1.length() - s1.indexOf('*')); 
    System.out.println(result); 
0

ich diesen Code für Ihr Problem hat geschrieben:

int step = 94; 
    String[] input = new String[]{ 
     "someThing/one_text_0000_temperature****", 
     "another/two_text_0000_temperature****", 
     "where/three_text_0000_temperature****" 
    }; 

    for (String i : input) { 
     int start = i.indexOf('*'); 
     int size = i.length() - start; 
     int stepsize = (step + "").length(); 
     if(stepsize > size) { 
      throw new IllegalArgumentException("Too big step :D"); 
     } 
     String result = i.replace('*', '0').substring(0, i.length() - stepsize) + step; 

     System.out.println(result); 
    } 

Ich hoffe, es ist Ihnen helfen :)

Verwandte Themen