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

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top