Coisas do Java que eu não entendo  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
fabim
GUJ Master
[Avatar]

Membro desde: 14/12/2006 19:30:03
Mensagens: 1268
Localização: Vitoria - Espirito Santo
Offline

Deve haver uma explicação óbvia pra isso, não é possivel.

Pq em um mesmo método ( o método sobrecarregado substring da classe String ), o primeiro argumento tem contagem
baseada em 0, mas o segundo argumento não?

ειπεν αυτη ο ιησους εγω ειμι η αναστασις και η ζωη ο πιστευων εις εμε καν αποθανη ζησεται

Sun Certified Web Component Developer
Sun Certified Java Programmer
Sun Certified Java Associate
Sun Certified Business Component Developer - Em Andamento
Bacharelando em Sistemas de Informacao


[MSN]
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

O segundo também é baseado em zero, mas ele indica a posição do caracter POSTERIOR ao último caracter.

javadoc wrote:
substring

public String substring(int beginIndex,
int endIndex)

Returns a new string that is a substring of this string. The substring begins at the specified beginIndex and extends to the character at index endIndex - 1. Thus the length of the substring is endIndex-beginIndex.


[WWW]
fabim
GUJ Master
[Avatar]

Membro desde: 14/12/2006 19:30:03
Mensagens: 1268
Localização: Vitoria - Espirito Santo
Offline

deu no mesmo.

se o primeiro argumetno NAO indica a posicao posterior, pq o segundo argumento sim?

malz ai thingol mas pra mim nao tem lógica não.

01234
FABIO

pra mim substring(1,2) teria que retornar "AB".

ειπεν αυτη ο ιησους εγω ειμι η αναστασις και η ζωη ο πιστευων εις εμε καν αποθανη ζησεται

Sun Certified Web Component Developer
Sun Certified Java Programmer
Sun Certified Java Associate
Sun Certified Business Component Developer - Em Andamento
Bacharelando em Sistemas de Informacao


[MSN]
shison
JavaBaby
[Avatar]

Membro desde: 28/12/2006 01:08:46
Mensagens: 82
Offline

Isto por que os argumentos definem os limites da substring, ou seja, é copiado tudo que está entre os limites, tudo a partir do primeiro argumento até o último char antes do segundo argumento.
Tenha em mente que o índice é a posição do cursor e não do caractere, então estando o cursor na posição 8 ele está antes do 8º char...

veja a documentação:

This message was edited 2 times. Last update was at 29/11/2007 14:38:58


----
Hudson Pena Magalhães
[MSN]
jjose
Virtual Machine Man
[Avatar]

Membro desde: 22/05/2007 23:10:22
Mensagens: 663
Localização: Paraiba
Offline

a = iniciar no:
b = finalizar no:
substring(a,b)
tu informa de onde ateh onde
onde vc que e naum onde o array inicia


Estatísticas mostram que no RJ você corre risco de levar um tiro antes mesmo de nascer.
No RJ proporção é de uma bala perdida por cada gota de chuva.
No RJ quando o assunto é bala perdida, o óbito considera causas naturais.

[Email] [WWW]
jjose
Virtual Machine Man
[Avatar]

Membro desde: 22/05/2007 23:10:22
Mensagens: 663
Localização: Paraiba
Offline

fabiocsi wrote:deu no mesmo.

se o primeiro argumetno NAO indica a posicao posterior, pq o segundo argumento sim?

malz ai thingol mas pra mim nao tem lógica não.

01234
FABIO

pra mim substring(1,2) teria que retornar "AB".


te retorno o que tem entre A e B

Estatísticas mostram que no RJ você corre risco de levar um tiro antes mesmo de nascer.
No RJ proporção é de uma bala perdida por cada gota de chuva.
No RJ quando o assunto é bala perdida, o óbito considera causas naturais.

[Email] [WWW]
fabim
GUJ Master
[Avatar]

Membro desde: 14/12/2006 19:30:03
Mensagens: 1268
Localização: Vitoria - Espirito Santo
Offline

nao escrevam como se eu nao lesse javadoc.

ele mesmo é INCOERENTE.

...
Parameters:
beginIndex - the beginning index, inclusive.
endIndex - the ending index, exclusive.
...

Isso é gambiarra, ou mal feito.
Ou é baseado em 0, ou não é.
Ou é intervalo fechado, ou é intervalo aberto.

Mas no caso, 1 argumento é uma coisa, e 1 argumento é outra.

O que o método faz eu sei, como ele age eu sei nao preciso de explicação... so to dizendo que acho horrível.

ειπεν αυτη ο ιησους εγω ειμι η αναστασις και η ζωη ο πιστευων εις εμε καν αποθανη ζησεται

Sun Certified Web Component Developer
Sun Certified Java Programmer
Sun Certified Java Associate
Sun Certified Business Component Developer - Em Andamento
Bacharelando em Sistemas de Informacao


[MSN]
shison
JavaBaby
[Avatar]

Membro desde: 28/12/2006 01:08:46
Mensagens: 82
Offline

Como eu disse, a lógica é que os índices são relativos a posição do cursor, e o método retorna o que está entre as posições dos cursores,, no caso você pode fazer uma analogia de quando selecionamos um texto com o mouse...

----
Hudson Pena Magalhães
[MSN]
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

Eu prefiriria que o substring tivesse 2 argumentos: o índice inicial e a quantidade máxima de caracteres retornados.
Já tive de fazer um encapsulamento para o método substring porque ele é desajeitado para o uso prático.
(Por exemplo, se eu precisar de 5 caracteres mas só estiverem disponíveis 3 porque a string original era mais curta que o imaginado, não deveria ocorrer uma exception, mas retornar apenas 3 caracteres.)
[WWW]
mister__m
Virtual Machine Man
[Avatar]

Membro desde: 18/03/2005 16:13:17
Mensagens: 736
Offline

fabiocsi wrote:nao escrevam como se eu nao lesse javadoc.

ele mesmo é INCOERENTE.

...
Parameters:
beginIndex - the beginning index, inclusive.
endIndex - the ending index, exclusive.
...

Isso é gambiarra, ou mal feito.

...

Ou é intervalo fechado, ou é intervalo aberto.


A maioria dos intervalos que nós temos em mente são semi-abertos. Por exemplo, quando você marca um compromisso das 09:30 às 10:30 na sua agenda, você espera poder marcar outro compromisso às 10:30. Essa foi a lógica usada para o substring.

No entanto, concordo que o substring sugerido pelo thingol seria mais útil em geral. Algumas linguagens têm, por padrão, funções/métodos que fazem as duas coisas.

Michael Nascimento Santos, aka Mister M

Summa Technologies do Brasil - http://www.summa-tech.com/
genesis: Uma nova forma de desenvolver aplicações - https://genesis.dev.java.net/
ThinNB: Suporte a Thinlet no NetBeans - https://thinnb.dev.java.net/
Líder da JSR-310 - Date and Time API
Expert Group Member das JSRs 207 (PD4J), 250 (Common Annotations), 270 (Java 2 SE 6.0), 296 (Swing Framework) e 303 (Bean Validation)
SouJava: Fortalecendo a comunidade Java brasileira - https://soujava.dev.java.net/ https://www.soujava.org.br/
JSR Community @ java.net - http://community.java.net/jsr
Blogs - http://blog.michaelnascimento.com.br/ http://today.java.net/pub/au/80
Twitter - @mr__m
[WWW]
maior_abandonado
JWizard
[Avatar]

Membro desde: 03/09/2007 11:30:08
Mensagens: 2694
Localização: sp
Offline

o substring sugerido pelo tingol foi uma boa ideia mesmo, por causa de que evita perda de tempo com tratamento de exceção, masi ainda assim, concordo com o que o fabio disse... ou intervalo aberto ou fechado... pode até ser que seja assim por causa do endereço do indice, mais fica estranho...

espero ter ajudado...

falando nisso, caso seu problema tenha sido resolvido, edite o seu primeiro post e coloque um [RESOLVIDO] no titulo do tópico.
otaviofcs
Virtual Machine Man
[Avatar]

Membro desde: 21/12/2006 18:01:54
Mensagens: 511
Localização: Rio de Janeiro
Offline

fabiocsi wrote:ele mesmo é INCOERENTE.


Fabio, concordo. Só que Java não é feito de coerência nem de simplicidade. Meu exemplo é sempre o objeto Date. O que é o objeto Date? Coisa ridícula, perdida, que necessita do Calendar, do SimpleDateFormat para dar funcionalidades mínimas. E o java.sql.Date? Porque existe um primitivo para long e não um para Date?

O negócio do Java é criar um padrão e levar ele até o fim. Se criaram errado, paciência. Por outro lado, a compatibilidade pra trás aproxima as empresas. Tudo isso se aplica fortemente ao substring.

visite o blog da Riopro em:
http://blog.riopro.com.br

Aumente a capacidade de inovação na sua empresa usando o Zest:
http://zest.com.br

Conheça também:
http://votebolsa.com.br
[WWW]
mister__m
Virtual Machine Man
[Avatar]

Membro desde: 18/03/2005 16:13:17
Mensagens: 736
Offline

otaviofcs wrote:
fabiocsi wrote:ele mesmo é INCOERENTE.


Fabio, concordo. Só que Java não é feito de coerência nem de simplicidade. Meu exemplo é sempre o objeto Date.


Opa, tae um assunto que eu entendo!

otaviofcs wrote:O que é o objeto Date?


Um número de milissegundos desde 01/01/1970.

otaviofcs wrote:que necessita do Calendar, do SimpleDateFormat para dar funcionalidades mínimas


Calendar deveriiiiiiiia suportar múltiplos sistemas de calendário, como chinês ou coptic. Formatação é normalmente um assunto mais complexo mesmo, aí discordo de você. O toString() de Date deveria ser suficiente.

otaviofcs wrote:E o java.sql.Date?


sql.Date é uma data "humana" com dia, mês e ano somente. Existe porque nada mais no Java representa isso.

otaviofcs wrote:Porque existe um primitivo para long e não um para Date?


Porque não existia no C++ nem o Gosling conseguia ver a necessidade de um primitivo. O que não deveria existir são os tipos primitivos e não o contrário.

otaviofcs wrote:O negócio do Java é criar um padrão e levar ele até o fim. Se criaram errado, paciência.


No caso das datas em si, estamos corrigindo.

Michael Nascimento Santos, aka Mister M

Summa Technologies do Brasil - http://www.summa-tech.com/
genesis: Uma nova forma de desenvolver aplicações - https://genesis.dev.java.net/
ThinNB: Suporte a Thinlet no NetBeans - https://thinnb.dev.java.net/
Líder da JSR-310 - Date and Time API
Expert Group Member das JSRs 207 (PD4J), 250 (Common Annotations), 270 (Java 2 SE 6.0), 296 (Swing Framework) e 303 (Bean Validation)
SouJava: Fortalecendo a comunidade Java brasileira - https://soujava.dev.java.net/ https://www.soujava.org.br/
JSR Community @ java.net - http://community.java.net/jsr
Blogs - http://blog.michaelnascimento.com.br/ http://today.java.net/pub/au/80
Twitter - @mr__m
[WWW]
rodrigoallemand
GUJ Ranger
[Avatar]

Membro desde: 21/02/2005 20:19:47
Mensagens: 972
Localização: Rio de Janeiro, Recreio!!!
Offline

thingol wrote:Eu prefiriria que o substring tivesse 2 argumentos: o índice inicial e a quantidade máxima de caracteres retornados.


Se não me engano, o substr do vb funciona assim, correto?!?
[WWW] [MSN]
thingol
Moderador

Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline

rodrigoallemand wrote:
Se não me engano, o substr do vb funciona assim, correto?!?


Acho que Java é o "ponto fora da curva". Nunca vi isso em nenhuma outra linguagem (se bem que não fiquei checando todas :P )

Só de olhar no MSDN dá para ver porque é que um Microsoft-Man tem problemas com o método substring do Java. Mesmo outras linguagens não-Microsoft também são assim.

VB: mid$ - parâmetros: string, posição inicial (começa por 1), quantidade máxima de caracteres (parâmetro opcional; se omitido, vai até o final da string)
FoxPro: SUBSTR - parâmetros: string, posição inicial (começa por 1), quantidade máxima de caracteres (parâmetro opcional; se omitido, vai até o final da string)
Transact-SQL: SUBSTRING - parâmetros: string, posição inicial (começa por 1), quantidade máxima de caracteres (parâmetro opcional; se omitido, vai até o final da string)
C++ (std::string ): substr - parâmetros: posição inicial (começa por 0), quantidade máxima de caracteres
C# (System.String): Substring - parâmetros: posição inicial (começa por 0), quantidade máxima de caracteres (parâmetro opcional; se omitido, vai até o final da string)

Não-Microsoft:
Delphi : Copy - parâmetros: string, posição inicial (começa por 1), quantidade máxima de caracteres
AWK: substr - parâmetros: string, posição inicial (começa por 1), quantidade máxima de caracteres (parâmetro opcional; se omitido, vai até o final da string)

Parece com Java mas não é:
Python: notação de fatias ("slice notation") - você especifica a posição inicial e a final. Exemplo:
s = "Python rulez!";
s [8:12] lhe retorna a palavra "rulez" (começa na posição 8 - as posições começam por 0, e termina na posição 12.)
Ada é quase a mesma coisa que Python, mas a posição inicial é 1 e a sintaxe é usando (..). Exemplo:
s := "Ada rulez";
s (5..9) lhe retorna a palavra "rulez".
[WWW]
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team