IndexOf metodo restituisce 0 quando dovrebbe avuto ritorno -1 in C # / Java
Domanda
Un mio amico è venuto da me con questo strano comportamento, che non riesco a spiegare, qualsiasi visualizzazione intuizione sarebbe apprezzato.
Im esecuzione VS 2005 (C # 2.0), il codice seguente mostra il comportamento
int rr = "test".IndexOf("");
Console.WriteLine(rr.ToString());
il codice di cui sopra, la stampa "0", che mostrano chiaramente che dovrebbe avere di ritorno -1
Questo accade anche in Java dove la seguente classe mostrano il comportamento:
public class Test{
public static void main(String[] args){
System.out.println("Result->"+("test".indexOf("")));
}
}
Im in esecuzione Java 1.6.0_17
Soluzione
Questa non è un'eccezione alla regola, ma piuttosto una conseguenza naturale di come indexOf
e startsWith
sono definiti.
Si sta affermando che "test".indexOf("")
dovrebbe restituire -1
. Questo è essenzialmente equivalente alla affermazione che "test".startsWith("")
dovrebbe restituire false
. Perchè è questo? Anche se questo caso è specificamente indirizzata nella documentazione come tornare true
, questo non è solo una decisione arbitraria.
Come ti deciderà "test".startsWith("te")
, per esempio? Il modo più semplice è quello di utilizzare la ricorsione. Dal momento che entrambe le stringhe iniziano con il carattere 't'
, si chiama "est".startsWith("e")
e restituire il risultato. Allo stesso modo, si chiamerà "st".startsWith("")
e restituire il risultato. Ma si sa già che la risposta dovrebbe essere true
, così che è il motivo per cui ogni stringa inizia con ""
.
Altri suggerimenti
Citazione dal C # documentazione :
Se il valore è Vuoto , il valore di ritorno è 0.
Il comportamento che descrivi è del tutto come previsto (almeno in C #).
0 è corretta. Iniziare in posizione zero e si possono (banalmente) abbinare una stringa di lunghezza zero. Allo stesso modo, "" contiene "".
0 è corretta. Il punto Javadocs che indexOf
funziona nel modo seguente:
L'intero restituito è il più piccolo valore k tale che:
this.startsWith(str, k)
Qualsiasi stringa che inizia con ""
è uguale alla stringa originale (e ogni stringa inizia con ""
), in modo che il più piccolo k
per str = ""
è sempre 0.
Pensare in questo modo: IndexOf, quando alla ricerca di una stringa, avrà inizio alle posizione 0, cercare di far corrispondere la stringa, se non si adatta, mossa alla posizione 1, 2, ecc Quando si chiami con una stringa vuota, tenta di abbinare la stringa vuota con la stringa a partire dalla posizione 0 con lunghezza 0. E evviva, nulla è uguale a niente.
Nota a margine: Non c'è alcun motivo reale per uso ToString
quando si utilizza Console.Write / WriteLine. La funzione chiama automaticamente il metodo ToString
dell'oggetto in questione. (A meno che il sovraccarico ToString)
Si deve restituire 0. Si sta cercando la prima occorrenza di una stringa vuota, giusto? :)
Più divertimento php fa in realtà un modo migliore lavoro!
php -r "print strpos('test','');"
PHP Warning: strpos(): Empty delimiter. in Command line code on line 1
Solo per il gusto di farlo. Funziona anche come quella in Python
>>> "test".startswith("")
True
>>> "test".index("")
0
Python lancia un ValueError al posto del -1 che è bello.
>>> "test".index('r')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: substring not found