2013-10-28 13 views
13

Czy można użyć ujemnego jako indeksu końcowego dla string.substring w Javie?W Javie, możesz użyć ujemnego z podciąganiem?

Przykład:

String str = "test"; 
str.substring(0, str.indexOf("q")); 

Edit: Nigdzie w Javadocs to powiedzieć wprost, że endIndex nie może być ujemna. Istnieją implementacje podłańcuchów w innych językach i bibliotekach, które pozwalają na negatywny endindex, ale mają ujemny beginindex, więc wydaje się istotne, aby było to wyraźnie powiedziane. Nie jest to w żaden sposób dorozumiane. (Edycja: ok jest domniemana luźno, ale ja i podobno inni, którzy zadawali mi to pytanie osobiście, wciąż uważają to za dość niejasne.) To miało być proste Q + A, które dostarczyłem nie mnie, w rzeczywistości próbując znaleźć odpowiedź na to trywialne pytanie)

Odpowiedz

28

No. Ujemne indeksy są dozwolone , a nie.

Od String#substring(int beginIndex, int endIndex):

Zgłasza: IndexOutOfBoundsException - jeśli beginIndex jest ujemna lub endIndex jest większa niż długość tego obiektu String lub beginIndex jest większa niż endIndex.

Podczas gdy dokumentacja nie bezpośrednio stwierdzić, że endIndex nie może być ujemna , to można wyprowadzić. Przepisanie odpowiednich wymogów uzyskuje te fakty:

  1. "beginIndex nie może być ujemna" ->beginIndex >= 0
  2. "beginIndex musi być mniejsza lub równa ENDINDEX" ->endIndex >= beginIndex

Jest to więc wymaganie, że endIndex >= beginIndex >= 0 oznacza, że ​​endIndex nie może być ujemny.


Zresztą str.substring(0, -x) można trywialnie przepisany jako str.substring(0, str.length() - x), zakładając, że mamy ten sam pomysł co ujemny indeks końcowy powinien oznaczać. Początkowo obowiązujące wymagania nadal obowiązują.


ciekawe, String#subSequencema wyraźnie zabraniają negatywny endIndex. Biorąc pod uwagę takie, wydaje się, że dokumentacja może zostać oczyszczona w taki sposób, że obie metody mają ten sam uproszczony tekst wstępny. (W ramach bonusu: istnieje również ważna literówka w dokumentacji podrozdziału "Java 7".)

2

No, użycie liczb ujemnych dla endindeksu podciągu, a także liczby większej niż długość łańcucha spowoduje wyjątek StringIndexOutOfBoundsException.

(Nie uwierzysz, jak trudno było znaleźć prostą odpowiedź na to pytanie w internecie)

Powiązane problemy