2013-03-25 16 views
7

muszę wyodrębnić pierwszą całkowitą znaleźć w java.lang.String i jestem pewien, czy aby spróbować użyć podejście substring lub regex podejście:Wydajność Porównanie między podciąg vs RegEx gdy wskaźnik start jest znany

// Want to extract the 510 into an int. 
String extract = "PowerFactor510"; 

// Either: 
int num = Integer.valueof(extract.substring(???)); 

// Or a regex solution, something like: 
String regex = "\\d+"; 
Matcher matcher = new Matcher(regex); 
int num = matcher.find(extract); 

Tak więc pytam:

  • Który typ rozwiązania jest bardziej odpowiedni tutaj i dlaczego ?; i
  • Jeśli podejście do podciągu jest bardziej odpowiednie, co mógłbym użyć, aby wskazać początek numeru?
  • Inaczej, jeśli regex jest odpowiednim rozwiązaniem, jaki jest regex/pattern/matcher/method, który powinienem użyć, aby wyodrębnić numer?

Uwaga: Ciąg będzie zawsze zaczyna się słowem PowerFactor następnie nieujemną liczbą całkowitą. Z góry dziękuję!

+1

Regex byłby bardziej wskazany ze względu na szybsze przetwarzanie. –

+3

Czy regex działa naprawdę szybciej niż 'substring (11)'? Pierwsza część jest zawsze ustalona ... Nie sądzę, że parsowanie regex, przechodzenie przez ciąg i wyodrębnianie odpowiedniej grupy byłoby szybsze niż po prostu odetnij 11 pierwszych znaków ... – ppeterka

+0

http: // docs. oracle.com/javase/6/docs/api/java/lang/String.html#substring(int) – Kent

Odpowiedz

10

Ciąg zawsze zaczyna się słowem „współczynnik mocy”, a następnie przez nieujemną liczbą całkowitą

Oznacza to, że dokładnie wiemy, w którym wskaźnik można znaleźć numer, chciałbym wam powiedzieć lepiej używaj podciągu bezpośrednio, przynajmniej biorąc pod uwagę wydajność, która byłaby znacznie szybsza niż wyszukiwanie i porównywanie pracy.

extract.substring("PowerFactor".length()); 

nie mogłem znaleźć żadnego bezpośredniego porównania, ale można przeczytać o każdym z dwóch opcji:

1

Był nieco ciekawy i próbowałem po

String extract = "PowerFactor510"; 
long l = System.currentTimeMillis(); 
System.out.println(extract.replaceAll("\\D", "")); 
System.out.println(System.currentTimeMillis() - l); 

System.out.println(); 

l = System.currentTimeMillis(); 
System.out.println(extract.substring("PowerFactor".length())); 
System.out.println(System.currentTimeMillis() - l); 

I stwierdziło, że drugi test był znacznie szybszy, więc wygrał substring.

+0

Dlaczego na świecie umieściłeś w nawiasie '\ D'? – tchrist

+0

@tchrist Wydano odpowiedź – tmwanik

+2

To jest straszny test. Metoda replaceAll klasy String wykonuje kompilację inline na regeksie przed jej przetworzeniem. Metoda ta nie daje odpowiedniego testu względem Pattern/Matcher lub czegokolwiek związanego z RegEx. Widoczne różnice prędkości są związane z tworzeniem obiektów i GC w JVM. – ingyhere