2011-06-14 7 views

Respuesta

16

Porque:

  • de Java se basa en C y C hace de esta manera
  • Esto hace que el código más limpio: Si desea capturar hasta el final del objeto, pasar object.length (sin embargo los implementos de objetos esto, por ejemplo, tamaño() etc) en el parámetro toIndex - no hay necesidad de añadir/restar 1

Por ejemplo:

String lastThree = str.substring(str.length() - 3, str.length()); 

De esta manera, es muy obvio lo que está sucediendo en el código (algo bueno).

EDITAR Un ejemplo de una función C que se comporta como esto es strncat de string.h:

char *strncat(char *dest, const char *src, size_t n); 

el valor del parámetro size_t corresponde al parámetro java endPosition en que ambos son el longitud de la objeto, pero contando desde 0 si son el índice, sería un byte más allá de al final del objeto.

+2

+1 por la segunda razón –

+1

¿Qué función C lo hace de esta manera? –

+0

No es cierto que substr en C/C++ funcione como Java. substr en C toma una longitud como segundo parámetro, por lo que substr (3,2) significa "take 2 chars starting from the char with index 3". Creo que la sintaxis C es más legible. – fresko

-1

Además de lo dicho Bohemia:

Si fuera exclusiva, para obtener los primeros 4 caracteres de una cadena, que tendría que:

String firstFour = String.substring(0, 3);

Eso es bastante feo.

+1

¿El OP significa 'subcadena (0,3)'? –

+0

Me tomé la libertad de corregir su error (-1, 4) - sería (0, 3). Cheers – Bohemian

+9

Esta respuesta no parece tener sentido después de la edición. – Suragch

0

El problema es que no usaron la sintaxis C/C++. Creo que la sintaxis C es más legible. Ejemplo, si usted quiere tomar una subcadena con longitud de 2 a partir del 3er elemento de una lista de X, se escribe

X.subList(2,3). 

En Java, si usted quiere tomar una sublista con solamente la tercera elemento de una lista de X, necesita escribir X.subList (2,3). Eso es realmente feo, parece que estás tomando una sublista de 2 elementos. Por otro lado, X.subList (2,2) es una lista vacía, bastante confusa.

int startIndex = calculateStartIndex(); 
int endIndex = calculateEndIndex(); 
X.subList(startIndex, endIndex); 

En realidad, si (startIndex == endIndex) → lista vacía.

Su pregunta era: ¿por qué ?, así que aquí está mi respuesta. ¿Qué pasaría si ambos parámetros en Java fueran inclusivos? Tendría un problema cuando necesita tomar una lista vacía en caso de que calcule el segundo índice. Porque en la mayoría de los casos, los índices se calculan y no escribimos números directamente en las funciones.

Para tener una lista vacía, a menos que use una convención (ejemplo: en caso negativo o inferior endIndex return empty list) - pero dicha convención podría ocultar errores en la codificación (no hay diferencia si el segundo parámetro -1 o -100!):

int startIndex = calculateStartIndex(); // return 0 
int endIndex = calculateEndIndex();  // return 0 
X.subList(startIndex, endIndex);  // this would return the 1st element of the list; how to get an empty list? Convenction needed! 
             // use a negative number to get empty list? And what if endIndex is negative because of a bug? 

I este caso, C gana; más legible en cualquier caso, es una pena que hayan cambiado eso. Pero esto es solo un comentario adicional que puedes hacer.

0

Se llama la Dijkstra convención de rangos [i, j> (o en otra notación matemática [i, j). De esta manera se puede tratar con rangos [a, b>, [b, c>, [c, d].

Se argumentó que es algo más eficiente, y de hecho que los programadores utilizar en:

for (int i = 0; i < n; ++i) { ... } 

en tales intervalos el número de elementos es j - i, así que sí un -1/+ 1 se guarda

.

También se usa en BitSet.set(from, to)

Cuestiones relacionadas