2009-05-19 14 views
7

No entiendo por qué el [método String.substring() de Java] (http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html#substring(int,%20int%29)) está especificado tal como está. No puedo decir que empiece en una posición numerada y devuelva un número específico de caracteres; tengo que calcular la posición final yo mismo. Y si especifico una posición final más allá del final de la cadena, en lugar de solo devolver el resto de la cadena para mí, Java arroja una excepción.¿Cómo debería funcionar la subserie()?

Estoy acostumbrado a los idiomas donde la subcadena() (o substr()) toma dos parámetros: una posición de inicio y una longitud. ¿Es esto mejor que la forma en que lo hace Java, y si es así, puede probarlo? ¿Cuál es la mejor especificación de lenguaje para subserie() que tiene visto, y si alguna vez sería una buena idea para un idioma hacer las cosas de manera diferente? ¿Es eso IndexOutOfBoundsException que Java arroja una buena idea de diseño, o no? s todo esto solo se reduce a preferencia personal?

+2

De hecho, es una cuestión de preferencia personal, que es lo que hace este "Subjetivo y argumentativo". He necesitado los sabores de "longitud" y "posición final" de la subcadena en diferentes momentos, por lo que para mí no tiene sentido decir que uno es "mejor" que el otro. –

+2

No es necesario argumentar sobre esto simplemente porque es subjetivo. Sheesh. ¿No podemos hablar sobre los méritos relativos de las decisiones lingüísticas sin tener una guerra santa? Si Jon Skeet cree que vale la pena responder y no es solo una llamada a discusión, ¿eso significa algo? – skiphoppy

+1

Si lo edito para eliminar las palabras "asombrado" e "inconveniente", ¿parecerá menos argumentativo, ya que nadie ha discutido? ¿Las preguntas de diseño de lenguaje (que intrínsecamente implican una compensación subjetiva en la mayoría de los casos) no son apropiadas para el desbordamiento de pila? – skiphoppy

Respuesta

1

Si leave off the 2nd parameter irá al final de la cadena por usted sin tener que calcularla.

+0

A veces se desea desde x hasta 20 caracteres más tarde o al final de la cadena, lo que sea más corto. – Yishai

+1

Y a veces desea desde x hasta la mitad del resto de la cadena, sin incluir los dígitos. Ninguna API puede cumplir todos los requisitos posibles. –

+1

Ninguna API puede cumplir todos los requisitos posibles, pero creo que algunas API pueden cumplir con más requisitos que otras. Todavía estoy reflexionando sobre eso y mirando las respuestas. :) – skiphoppy

3

segundo parámetro debe ser opcional, primer parámetro debe aceptar los valores negativos ..

5

Estoy acostumbrado a los idiomas en los subcadena() (o substr()) toma dos parámetros: una posición de inicio, y una longitud . ¿Es objetivamente mejor que la forma en que lo hace Java, y si es así, puede probarlo?

No, no es objetivamente mejor. Todo depende del contexto en el que quiera usarlo. Si desea extraer una subcadena de una longitud específica, es incorrecta, pero si desea extraer una subcadena que finalice, por ejemplo, en la primera aparición de "." en la cadena, es mejor que si primero tuvieras que calcular una longitud. La pregunta es: ¿qué requisito es más común? Yo diría esto último. Por supuesto, la mejor solución sería tener ambas versiones en la API, pero si necesita la basada en la longitud todo el tiempo, usar un método de utilidad estático no es tan horrible.

En cuanto a la excepción, sí, definitivamente es un buen diseño. Usted solicitó algo específico, y cuando no puede obtener esa información específica, la API no debe tratar de adivinar lo que podría haber deseado en su lugar, de esa manera, los errores se hacen evidentes más rápidamente.

Además, Java tiene un método alternative substring() que devuelve la subcadena de un índice de inicio hasta el final de la cadena.

9

Hay momentos en que el segundo parámetro es una longitud más conveniente, y hay momentos en que el segundo parámetro es el "desplazamiento para detener antes" es más conveniente. Del mismo modo, hay momentos en los que "si te doy algo que es demasiado grande, simplemente ve al final de la cuerda" es conveniente, y hay momentos en que indica un error y realmente debería arrojar una excepción.

El segundo parámetro es una longitud útil si tienes una longitud de campo fija.Por ejemplo:

// C# 
String guid = fullString.Substring(offset, 36); 

El segundo parámetro que se está un desplazamiento es útil si estás subiendo a otro delimitado:

// Java 
int nextColon = fullString.indexOf(':', start); 
if (start == -1) 
{ 
    // Handle error 
} 
else 
{ 
    String value = fullString.substring(start, nextColon); 
} 

Por lo general, la persona que desee utilizar es la opuesta a la que está provisto en su plataforma actual, en mi experiencia :)

+4

+1 para la última frase. :) – jmucchiello

+0

+1, por la misma razón. –

+0

+1. Misma razón. –

1

Al haber recibido algunos comentarios, veo cuando el escenario del segundo parámetro como índice es útil, pero hasta ahora todos esos escenarios parecen funcionar en otro idioma/Limitaciones API Por ejemplo, la API no proporciona una rutina conveniente para darme las cadenas antes y después de los primeros dos puntos en la cadena de entrada, así que en su lugar obtengo el índice de esa cadena y llamo a la subcadena(). (Y esto explica por qué el parámetro de segunda posición en substr() sobrepasa el índice deseado en 1, IMO.)

Me parece que con un conjunto más completo de funciones de procesamiento de cadenas en el kit de herramientas del idioma, el segundo El escenario parámetro-como-índice pierde en segundo parámetro-como-longitud. Pero alguien por favor publícame un contraejemplo. :)

+0

"Por ejemplo, la API no proporciona una rutina conveniente para darme las cadenas antes y después de los primeros dos puntos en la cadena de entrada, así que en su lugar obtengo el índice de esa cadena y la subcadena de llamada()". - Si quisieras que una API hiciera todo, tendríamos enormes API para aprender y Stack Overflow consistiría en respuestas que preguntaran por qué alguien no usó uno de los 30000 métodos en el objeto String en lugar de pasar 30 segundos escribiendo ellos mismos. Es por eso que somos programadores, porque aún no se ha escrito todo. Si necesita hacer una gran tarea X, escriba su propia biblioteca para hacerlo. –

+0

¿Por qué en el mundo todos querrían escribir su propia biblioteca cuando podrían tener una implementación para depurar todos los errores de fencepost implicados? – skiphoppy

0

Si almacena esta distancia, el problema debe dejar que plagan sus sueños y usted finalmente conseguir una buena noche de descanso:

public String skipsSubstring(String s, int index, int length) { 
    return s.subString(index, index+length); 
} 
+0

Eso simplemente explotará con una excepción IndexOutOfBoundsException. :) Tendría que agregar una marca de verificación para hacer que el segundo parámetro para subcadena() sea min (index + length, s.length()). – skiphoppy

+0

Después de analizar la implementación de String, parece que no sería demasiado difícil para Java proporcionar ambos paradigmas: substring() puede continuar tal cual y substr() podría seguir la semántica más común en otros lenguajes. Internamente, la implementación parece ser directa. – skiphoppy

+1

Creo que sería horrible tener subcadena() y substr(), con semántica diferente.Puedo más o menos garantizar que usaré el incorrecto más de la mitad de las veces, y creo que la mayoría de mis compañeros programadores también lo harían. –

Cuestiones relacionadas