2010-04-02 9 views
7

Un mio amico è venuto da me con questo strano comportamento che non riesco a spiegare, qualsiasi visualizzazione di intuizione sarebbe apprezzata.Il metodo IndexOf restituisce 0 quando avrebbe dovuto restituire -1 in C#/Java

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, stampa "0", che mostrano chiaramente che dovrebbe avere di ritorno -1

Questo anche accadere 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 esecuzione Java 1.6.0_17

+0

duplicati di http://stackoverflow.com/questions/3872936/why-do-strings-start-with-a-in-java e http://stackoverflow.com/questions/145509/why- does-abcd-startswith-return-true –

risposta

10

Questa non è un'eccezione alla regola, ma piuttosto una conseguenza naturale di come sono definiti indexOf e startsWith.

Si sta sostenendo che "test".indexOf("") deve restituire -1. Ciò equivale essenzialmente all'affermazione che "test".startsWith("") deve restituire false. Perchè è questo?Sebbene questo caso sia specificamente indirizzato nella documentazione come restituendo true, questa non è solo una decisione arbitraria.

Come scegliere "test".startsWith("te"), ad esempio? Il modo più semplice è usare la ricorsione. Poiché entrambe le stringhe iniziano con il carattere 't', si chiama "est".startsWith("e") e si restituisce il risultato. Allo stesso modo, chiamerai "st".startsWith("") e restituirai il risultato. Ma sai già che la risposta dovrebbe essere true, ecco perché ogni stringa inizia con "".

+0

@jleedev ottima spiegazione grazie – jcgarciam

10

0 è corretto. Inizia dalla posizione zero e tu puoi (banalmente) abbinare una stringa di lunghezza zero. Allo stesso modo, "" contiene "".

+0

che andrebbe bene se questo sarebbe stato il mio esempio, ho provato: "Test" .IndexOf (""); che è diverso da quello che spieghi. – jcgarciam

+0

@jcgarciam non proprio. Guardate in questo modo; in che modo ** non ** inizia con (o contiene) "". Mostrami il personaggio che non è una corrispondenza. Non ce n'è uno, quindi è una corrispondenza. –

21

Citazione dal C# documentation:

Se il valore è Empty, il valore di ritorno è 0.

Il comportamento che descrivi è del tutto come previsto (almeno in C#).

+0

Grazie per aver segnalato per C# (Quindi sembra un'eccezione alla regola). Sulla sua controparte (JavaDoc), non è ben spiegato che questo comportamento sarà previsto. – jcgarciam

+0

@jcgarciam: buon punto; Aggiornerò la risposta indicando che è correlato a C#. –

6

0 è corretto. I Javadocs sottolineano che indexOf funziona come segue:

Il numero intero restituito è il più piccolo valore k tale che:

this.startsWith(str, k) 

Qualsiasi stringa iniziano "" è uguale alla stringa originale (e ogni stringa inizia con ""), quindi il più piccolo k per str = "" è sempre 0.

+0

Scusa, ma non riesco a capire il tuo ragionamento su questo. – jcgarciam

+4

* Ogni singola stringa * inizia con "" Allo stesso modo, ogni singolo set è un superset di un set vuoto. Etc ... È una convenzione molto conveniente. – glebm

+0

Grazie per averlo indicato @glebm – jcgarciam

2

Dovrebbe restituire 0. Si stai cercando la prima occorrenza di una stringa vuota, giusto? :)

3

Pensa in questo modo: IndexOf, quando cerchi una stringa, inizierà dalla posizione 0, prova ad abbinare la stringa, se non si adatta, passa alla posizione 1, 2, ecc. lo chiami con una stringa vuota, tenta di far corrispondere la stringa vuota con la stringa che inizia alla posizione 0 con la lunghezza 0. E evviva, niente è uguale a niente.

Nota a margine: Non c'è un vero motivo per utilizzare ToString quando si utilizza Console.Write/WriteLine. La funzione chiama automaticamente il metodo ToString dell'oggetto in questione. (Salvo sovraccarico di ToString)

+0

Nella posizione dell'indice 0, "test" non contiene "niente" ha una "t". Votato +1 per il modo in cui lo metti. :) –

+0

come dice l'anello, in posizione 0 non contiene "nulla". Ma grazie comunque! Sembra che questo è spiegato nella documentazione. Metterò questa come eccezione alla regola del funzionamento di IndexOf. – jcgarciam

1

Solo per il gusto di farlo. Funziona anche come quella in pitone

>>> "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 
1

Più divertente php, in realtà, fa un lavoro migliore!

php -r "print strpos('test','');" 
PHP Warning: strpos(): Empty delimiter. in Command line code on line 1 
Problemi correlati