Como deve substring () funciona?

votos
7

Eu não entendo por que [método String.substring ()] de Java ( http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html#substring(int,%20int% 29) é especificada a forma como ele é que não posso dizer-lhe para começar em uma posição numeradas e retornar um número especificado de caracteres;. Eu tenho que calcular a posição final mim e se eu especificar uma posição final para além do fim. a string, em vez de apenas devolvendo o restante da cadeia para mim, Java lança uma exceção.

Estou acostumado a idiomas onde substring () (ou substr ()) leva dois parâmetros: a posição inicial e um comprimento. É este objetivamente melhor do que a maneira como Java faz isso, e se assim for, você pode provar isso? Qual é a melhor especificação da linguagem para substring () que você já viu, e quando, se alguma vez seria uma boa ideia para uma linguagem para fazer as coisas de forma diferente? É que IndexOutOfBoundsException que Java lança uma boa idéia do projeto, ou não? Será que tudo isso só descer a preferência pessoal?

Publicado 19/05/2009 em 17:02
fonte usuário
Em outras línguas...                            


6 respostas

votos
9

Há momentos em que o segundo parâmetro sendo um comprimento é mais conveniente, e há momentos em que o segundo parâmetro a ser o "deslocamento para parar antes" é mais conveniente. Da mesma forma há momentos em que "se eu dar-lhe algo que é muito grande, basta ir até o fim da string" é conveniente, e há momentos em que isso indica um bug e deve realmente lançar uma exceção.

O segundo parâmetro sendo um comprimento é útil se você tem um comprimento fixo de campo. Por exemplo:

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

O segundo parâmetro sendo um deslocamento é útil se você estiver indo para outra delimitado:

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

Normalmente, o que você deseja usar é o oposto ao que é fornecido em sua plataforma atual, na minha experiência :)

Respondeu 19/05/2009 em 17:15
fonte usuário

votos
5

Estou acostumado a idiomas onde substring () (ou substr ()) leva dois parâmetros: a posição inicial e um comprimento. É este objetivamente melhor do que a maneira como Java faz isso, e se assim for, você pode provar isso?

Não, não é objetivamente melhor. Tudo depende do contexto em que você quiser usá-lo. Se você quer extrair uma substring de um comprimento específico, é ruim, mas se você quer extrair uma substring que termina em, digamos, a primeira ocorrência de "" na seqüência, é melhor do que se você primeiro tinha que calcular um comprimento. A questão é: qual exigência é mais comum? Eu diria que o último. Claro, a melhor solução seria ter as duas versões do API, mas se você precisar a todo o tempo à base de comprimento, usando um método utilitário estático não é tão horrível.

Quanto à exceção, sim, isso é definitivamente bom design. Você pediu algo específico, e quando você não pode obter essa coisa específica, a API não deve tentar adivinhar o que você poderia querer em vez - dessa forma, erros tornam-se aparentes mais rapidamente.

Além disso, Java tem uma subsequência alternativa () método que retorna a subsequência de um índice de início até ao fim da cadeia.

Respondeu 19/05/2009 em 17:13
fonte usuário

votos
3

segundo parâmetro deve ser opcional, primeiro parâmetro deve aceitar valores negativos ..

Respondeu 19/05/2009 em 17:08
fonte usuário

votos
1

Tendo obtido algum feedback, eu vejo quando o cenário do segundo parâmetro-as-índice é útil, mas até agora todos esses cenários parecem estar a trabalhar em torno de outras limitações de idioma / API. Por exemplo, a API não fornece uma rotina conveniente para me dar o Cordas antes e após o primeiro dois pontos na cadeia de entrada, então ao invés eu recebo índice que de Cordas e chamar substring (). (E isto explica porque o segundo parâmetro posição em substr () ultrapassa o índice pretendido por 1, da IMO.)

Parece-me que, com um conjunto mais abrangente de funções de processamento de string no kit de ferramentas do idioma, o cenário do segundo parâmetro-as-índice perde para-segundo parâmetro-as-comprimento. Mas alguém por favor poste me um contra-exemplo. :)

Respondeu 19/05/2009 em 17:45
fonte usuário

votos
1

Se você deixar de fora o segundo parâmetro ele irá para o fim da cadeia para você, sem você ter que calcular isso.

Respondeu 19/05/2009 em 17:06
fonte usuário

votos
0

Se você armazenar esta distância, o problema deve parar assola seus sonhos e você finalmente vai conseguir uma boa noite de:

public String skipsSubstring(String s, int index, int length) {
    return s.subString(index, index+length);
}
Respondeu 19/05/2009 em 17:51
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more