2016-03-24 2 views
3

Ich habe eine Textdatei data.txt. Ich möchte die Daten in eine Hashmap eingeben und ein Datamapping durchführen. Wann immer ich den Wert ohne Punkt() treffe. Ich werde einen Fehler bekommenWie zeichne ich einen String mit dem vorletzten Punkt (.) In Java?

Wie überwinde ich es, indem ich diese Einträge ohne Punkt (.) Überspringe.

Ich habe ein kleines Schnipsel erstellt, um mein Problem zu veranschaulichen.

static HashMap<String, String> newList = new HashMap<>(); 
    public static void main(String[] args) throws FileNotFoundException, IOException { 
     String inputFile = "data.txt"; 
     BufferedReader brInput = new BufferedReader(new FileReader(inputFile)); 
     String line; 

     while ((line = brInput.readLine()) != null) { 
      newList.put(line, "x"); 
     } 

     for (Map.Entry<String, String> entry : newList.entrySet()) { 

      String getAfterDot = entry.getKey(); 
      String[] split = getAfterDot.split("\\."); 
      String beforeDot = ""; 
      beforeDot = getAfterDot.substring(0, getAfterDot.lastIndexOf(".")); 
      System.out.println(beforeDot); 
     } 

    } 

data.txt

0 
0.1 
0.2 
0.3.5.6 
0.2.1 
2.2 

erwartete Ergebnis, wenn i die Karte drucken (braucht nicht in Ordnung zu sein) lastIndexOf(int ch)

0 
0 
0.3.5 
0.2 
2 

Antwort

4

Verwenden der String-Methode.

int lastIndxDot = st.lastIndexOf('.'); 

st.substring(0, lastIndxDot); wird der Teil Sie wollen. Wenn es -1 zurückgibt, dann gibt es kein '.' in der Zeichenfolge.

EDIT:

for (Map.Entry < String, String > entry: newList.entrySet()) { 
    String getAfterDot = entry.getKey(); 
    int lastIndxDot = getAfterDot.lastIndexOf('.'); 
    if (lastIndxDot != -1) { 
     String beforeDot = getAfterDot.substring(0, lastIndxDot); 
     System.out.println(beforeDot); 
    } 
} 
+0

Ich bekomme immer noch eine Ausnahme im Thread "Haupt" java.lang.StringIndexOutOfBoundsException: String-Index außerhalb des Bereichs: -1 – newbieprogrammer

+0

@newbieprogrammer, welche Zeile ist es? –

+0

int lastIndxDot = getAfterDot.lastIndexOf ('.'); beforeDot = getAfterDotstring (0, lastIndxDot); – newbieprogrammer

0

Sie überprüfen können, um zu sehen, wenn die Zeichenfolge einen Punkt hat, bevor sie von getAfterDot.contains mit („“), bevor die Teilfunktion auf der Zeichenfolge aufgerufen wird.

static HashMap<String, String> newList = new HashMap<String, String>(); 
public static void main(String[] args) throws FileNotFoundException, IOException { 
    String inputFile = "data.txt"; 
    BufferedReader brInput = new BufferedReader(new FileReader(inputFile)); 
    String line; 
    while ((line = brInput.readLine()) != null) { 
     newList.put(line, "x"); 
    } 
    for (Map.Entry<String, String> entry : newList.entrySet()) { 
     String getAfterDot = entry.getKey(); 
     String[] split = getAfterDot.split("\\."); 
     String beforeDot = ""; 
     if(getAfterDot.contains(".")){ 
      beforeDot = getAfterDot.substring(0, getAfterDot.lastIndexOf(".")); 
      System.out.println(beforeDot); 
     } 
    } 

} 
+0

ich versuchte auch dies, und es funktioniert = D – newbieprogrammer

+0

@newbieprogrammer, _for performance_, erhalten 'lastIndexOf()' und sie prüfen, ob mehr als -1 anstelle der Prüfung mit 'enthält()' und letzte Index nach diesem – Nurlan

0

Eine Option wäre String.replaceAll() mit einem regulären Ausdruck zu verwenden, die vor Ablauf der Frist kommt den Teil der Zeichenfolge extrahiert (wenn die Zeit vorhanden ist).

for (Map.Entry<String, String> entry : newList.entrySet()) { 
    String getAfterDot = entry.getKey(); 
    String beforeDot = getAfterDot.replaceAll("(.*)\\..*", "$1"); 
    System.out.println(beforeDot); 
} 
+0

Dachte, ich immer Ich würde das herausstellen, wenn Sie es übersehen würden. 'lastIndexOf' gibt -1 zurück, wenn das Zeichen nicht gefunden wird. Sie müssen also keine wiederholte Iteration durchführen, indem Sie contains aufrufen. Ich dachte nur, ich würde es dich wissen lassen. –

+0

@DebosmitRay Bitte überprüfen Sie meine aktualisierte Antwort, danke. –

+0

Sieht gut aus, Kumpel :) –

0
String[] lines = new String[]{"0", "0.1", "0.2", "0.3.5.6", "0.2.1", "2.2"}; 
    for (String line : lines) { 
     int lastIndexOf = line.lastIndexOf("."); 
     if (lastIndexOf > -1) { 
      line = line.substring(0, lastIndexOf); 
      System.out.println(line); 
     } 
    } 
+1

Woher kam das Array? –

+0

@DebosmitRay, ** Zeilen ** wird zum Beispiel wie Ihr ** data.txt ** Dateiinhalt initialisiert. – Nurlan

1

diesen Code Versuchen sollte es funktionieren:

static HashMap < String, String > newList = new HashMap < >(); 
public static void main(String[] args) throws FileNotFoundException, IOException { 

    String inputFile = "input"; 
    BufferedReader brInput = new BufferedReader(new FileReader(inputFile)); 
    String line = null; 

    while ((line = brInput.readLine()) != null) { 

     newList.put(line, "x"); 
    } 

    for (Map.Entry < String, String > entry: newList.entrySet()) { 

     String getAfterDot = entry.getKey(); 
     if (getAfterDot.contains(".")) { 
      String[] split = getAfterDot.split("\\."); 
      String beforeDot = ""; 
      beforeDot = getAfterDot.substring(0, getAfterDot.lastIndexOf(".")); 
      System.out.println(beforeDot); 
     } 
    } 

} 

habe ich diesen Ausgang mit obigem Code:

0 
0 
2 
0.3.5 
0.2 
0

Ich dachte nur, dass ich darauf das getan werden kann in einer einzigen Zeile Code:

foo.substringAfterLast(".") 
Verwandte Themen