Wpis z mikrobloga

Dzień dobry. Mam pytanie o wydajność zastosowanego rozwiązania.

Problem: string w postaci liczba spacja liczba spacja(...) spacja spacja #num: liczba, z którego należy wydobyć ostatnią liczbę(ilość liczbo spacji na początku dowolna, liczby dowolnej długości). Przykład: "12 18 #num: 338921"
Rozwiązanie:

String input = "12 18 #num: 338921";

Pattern p = Pattern.compile("(\d+[ ])+[ ]#Num: ");
Matcher m = p.matcher(input);

if(m.find()){
result = input.substring(m.end()).trim();
}

Pytanie: czy to jest wydajne rozwiązanie, czy można to zrobić mądrzej/lepiej/szybciej?

#programowanie #java #regexp
  • 17
@KotoFan: I tak nie wiesz (tak zakładam), ile będzie liczb przed tym nieszczęsnym "#num:". Regexp niewiele tu pomoże, najprościej będzie zrobić split linii po spacji i pętelka. :)


List numbers = 
new ArrayList<>();
Integer specialNumber = 
null;
``````
List tokens = Arrays.asList(line.split(
"\s+"));
Iterator iter = tokens.iterator();
while (iter.hasNext()) {
  String token = iter.next();
  
if (!"#num:".equals(token)) {
    numbers.add(Integer.parseInt(token));
  } 
else {
    specialNumber = Integer.parseInt(iter.next());
    
break;
  }
}

Tu masz działający przykład: http://ideone.com/LZu6oJ
@KotoFan: To rozwiązanie które podałem powyżej rozbija ci stringa na listę liczb przed "#num:" i liczbę po tym elemencie. Więc masz wszystko. I – gwarantuję – regexpem tego ani szybciej, ani wygodniej, ani bardziej optymalnie nie #!$%@?. ( ͡° ͜ʖ ͡°)