2010-04-02 17 views
7

Un amigo mío vino a mí con este extraño comportamiento que no puedo explicar, cualquier visión sería apreciada.El método IndexOf devuelve 0 cuando debería haber devuelto -1 en C#/Java

Im que funciona VS 2005 (C# 2.0), el código siguiente muestra el comportamiento

int rr = "test".IndexOf(""); 
Console.WriteLine(rr.ToString()); 

el código anterior, imprimir "0", que muestran claramente que debe tener retorno -1

Esto también sucede en Java, donde la clase siguiente muestra el comportamiento:

public class Test{ 
public static void main(String[] args){ 
    System.out.println("Result->"+("test".indexOf(""))); 
} 
} 

Im ejecución de Java 1.6.0_17

+0

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

Respuesta

10

Esto no es una excepción a la regla, sino más bien una consecuencia natural de cómo se definen indexOf y startsWith.

Usted afirma que "test".indexOf("") debe devolver -1. Esto es esencialmente equivalente a la afirmación de que "test".startsWith("") debe devolver false. ¿Por qué es esto?Aunque este caso se trata específicamente en la documentación como return true, esto no es solo una decisión arbitraria.

¿Cómo decidirías "test".startsWith("te"), por ejemplo? La forma más simple es usar recursión. Como ambas cadenas comienzan con el carácter 't', se llama al "est".startsWith("e") y se devuelve el resultado. Del mismo modo, llamará al "st".startsWith("") y devolverá el resultado. Pero ya sabes que la respuesta debe ser true, por eso cada cadena comienza con "".

+0

@jleedev gran explicación gracias – jcgarciam

10

0 es correcto. Comience en la posición cero y puede (trivialmente) concuerde con una cadena de longitud cero. Del mismo modo, "" contiene "".

+0

que estaría bien si ese hubiera sido mi ejemplo, lo intenté: "Test" .IndexOf (""); que es diferente a lo que explicas. – jcgarciam

+0

@jcgarciam en realidad no. Míralo de esta manera; de qué manera ** no ** comienza con (o contiene) "". Muéstrame el personaje que no coincide. No hay uno, por lo tanto, es un partido. –

21

Presupuesto de la C# documentation:

Si el valor es Empty, el valor de retorno es 0.

El comportamiento que usted describe es del todo como se esperaba (al menos en C#).

+0

Gracias por señalarlo para C# (Parece una excepción a la regla). En su contraparte (JavaDoc), no está bien explicado que este comportamiento sea esperado. – jcgarciam

+0

@jcgarciam: buen punto; Actualizaré la respuesta indicando que está relacionada con C#. –

6

0 es correcto. Los Javadocs señalan que indexOf funciona como sigue:

El entero devuelto es el valor más pequeño k tal que:

this.startsWith(str, k) 

Cualquier cadena comenzando con "" es igual a la cadena original (y cada cadena comienza con ""), por lo que el k más pequeño para str = "" siempre es 0.

+0

Lo siento, pero no puedo entender su razonamiento sobre esto. – jcgarciam

+4

* Cada cadena * comienza con "" Del mismo modo, cada conjunto individual es un superconjunto de un conjunto vacío. Etc ... Es una convención muy conveniente. – glebm

+0

Gracias por señalar @glebm – jcgarciam

2

Debería devolver 0. Usted están buscando la primera aparición de una cadena vacía, ¿verdad? :)

3

Piénsalo de esta manera: IndexOf, al buscar una cuerda, comenzará en la posición 0, intenta hacer coincidir la cuerda, si no encaja, pasa a la posición 1, 2, etc. Cuando lo llamas con una cadena vacía, intenta hacer coincidir la cadena vacía con la cadena que comienza en la posición 0 con longitud 0. Y hurra, nada es igual a nada.

Nota al margen: no hay ningún motivo real para usar ToString cuando utiliza Console.Write/WriteLine. La función llama automáticamente al método ToString del objeto en cuestión. (A menos que sobrecargue ToString)

+0

En la posición de índice 0, "prueba" no contiene "nada", tiene una "t". Votado +1 por la forma en que lo pones. :) –

+0

como dice el anillo, en la posición 0 no tiene "nada". ¡Pero gracias de cualquier manera! Parece que esto se explica en la Documentación. Pondré esto como una excepción a la regla de cómo se supone que funciona IndexOf. – jcgarciam

1

Solo por el gusto de hacerlo. También funciona así en python

>>> "test".startswith("") 
True 
>>> "test".index("") 
0 

Python arroja un ValueError en lugar del -1 que es bueno.

>>> "test".index('r') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: substring not found 
1

Más divertido php en realidad hace un trabajo mucho mejor!

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