2017-05-28 16 views
-1

Ich habe eine Reihe von großen Strings wie folgen aussehen:Extract String- und Zahlenkombination aus einem größeren String

"text(24), text_2(5), text_4(822)..." 

Ich versuche, ein bestimmte Text zu überprüfen, ob vorhanden ist, und den entsprechenden Wert erhalten.

Gibt es einen schnellen Weg, dies zu tun?

Edit:

Ich habe einen Array mit allen möglichen Textwerten. Im Moment benutze ich foreach, um nach Textwerten zu suchen. Ich habe die Zeichenfolge text_2 und was ich brauche, ist die entsprechende 5 als Integer.

+0

Ich denke, dass Regex wird die Arbeit tun https://www.javatpoint.com/java-regex – Rjiuk

+0

versuchen Sie, dies einmal oder mehrmals für die angegebene Zeichenfolge zu tun? –

+0

Anzahl Male – Shaggy

Antwort

1

Da müssen Sie dies mehrmals tun. Ich schlage vor, dass Sie die Zeichenfolge teilen und eine Karte aus dem Text zu seinem Wert erstellen, das ist O (n). Danach sind Ihre Suchvorgänge nur O (1), wenn Sie HashMap verwenden.

String text = "text(24), text_2(5), text_4(822)"; 

Map<String, Integer> map = new HashMap<>(); 

String[] split = text.split(", "); 

for(String s:split){ 
    //search for the position of "(" and ")" 
    int start = 0; 
    int end = s.length()-1; 
    while(s.charAt(start) != '(') 
     start++; 
    while(s.charAt(end) != ')') 
     end--; 
    //put string and matching value in the map 
    map.put(s.substring(0, start), Integer.parseInt(s.substring(start+1, end))); 
} 

System.out.println(map); 

Ich habe auch einige Benchmarks für eine Zeichenfolge mit 10000 Einträgen durchgeführt. Und dieser Ansatz war etwa viermal schneller als ein Regex-Ansatz. (38 ms vs 163 ms)

+0

Vielen Dank, das hat für mich funktioniert. – Shaggy

+0

Wenn Leistung wirklich wichtig ist. Sie können einen ähnlichen Suchansatz für den ersten Teilungsschritt anwenden, aber ich sollte nicht mehr als einen Faktor 2 tun –

2

können Sie regex verwenden alle text Element aus dem String zu extrahieren und sie in eine map, z:

String s = "text(24), text_2(5), text_4(822)"; 
Pattern pattern = Pattern.compile("([a-zA-Z]*(_)?[0-9]*\\([0-9]+\\))"); 
Matcher matcher = pattern.matcher(s); 
Map<String, Integer> valuesMap = new HashMap<>(); 
while(matcher.find()){ 
    String[] tokens = matcher.group().split("(?=\\([0-9]+\\),?)"); 
    String key = tokens[0]; 
    Integer value = Integer.parseInt(tokens[1].substring(1, tokens[1].length() - 1)); 
    valuesMap.put(key, value); 
} 
System.out.println(valuesMap); 

Ist das erledigt, können Sie valuesMap.get("test_2"); rufen Sie den entsprechenden Wert zu erhalten. Dies ist, wie das obige Beispiel funktioniert:

  • Es spaltet Text in Token <text>(<Value)
  • enthält es dann jedes Token wieder spaltet, in text und value und setzt diese in ein Map.
+1

Ich denke, "Text" und "Text_2" sind nur Beispiele. Könnte besser sein, wenn es mit einem String funktioniert. –

+0

@ThijsSteel hat die Antwort aktualisiert. –

+0

Wer hat das abgelehnt? Es funktioniert für mich –