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?
O segundo também é baseado em zero, mas ele indica a posição do caracter POSTERIOR ao último caracter.
s="java rulez!"s=s.substring(5,10);// s = "rulez"012345678910+---+---+---+---+---+---+---+---+---+---+---+|j|a|v|a|_|r|u|l|e|z|!|+---+---+---+---+---+---+---+---+---+---+---+^^||iníciofim+1
fabim
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”.
shison
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...
a = iniciar no:
b = finalizar no:
substring(a,b)
tu informa de onde ateh onde
onde vc que e naum onde o array inicia
jjose
fabiocsi:
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
fabim
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.
shison
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…
T
thingol
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.)
mister_m
fabiocsi:
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.
maior_abandonado
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…
otaviofcs
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.
mister_m
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!
Um número de milissegundos desde 01/01/1970.
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.
sql.Date é uma data “humana” com dia, mês e ano somente. Existe porque nada mais no Java representa isso.
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.
Se não me engano, o substr do vb funciona assim, correto?!?
T
thingol
Acho que Java é o “ponto fora da curva”. Nunca vi isso em nenhuma outra linguagem (se bem que não fiquei checando todas )
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.
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)
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.
Java tem sim um padrão e é simples ( se entender o padrão, claro)
Para cada Objecto de Dados Não String existe um Objecto de Formatação I18N
Number -> NumberFormat
Date -> DateFormat
Fora que formatar datas é muito mais complexo que formatar números.
Calendar não é apenas necessário é vital. Sem ele Java não seria realmente I18N. Tudo bem que tem as suas idiossincrasias e por isso mesmo vem ai um nova API para colmatar as falhas.
Do ponto de vista do SQL , java.util.Date seria um DateTime , por isso é preciso um objeto que guarde apenas datas java.sql.Date , apenas tempos java.sql.Time e os dois java.sql.Timestamp. Os três heram de util.Date mas concatenam os valores para que haja uma maior coerencia de tipos.
Porque não existe um tipo primitivo para Date ? Pelo mesmo motivo que não existe para String.( Date é um objeto composto de inteiros como String de char. Ou seja, não são primitivos)
Todos os objetos do java têm a sua função. Alguns poderiam ter uns contratos melhores, mas a necessidade da sua existência é indiscutivel.
J
julianostr
E o substr do Oracle, também utilizado em blocos ou arquivos PL/SQL:
SQL> select substr(‘juliano’,1,2) from dual;
SU
ju
1 row selected.
SQL> select substr(‘juliano’,0,2) from dual;
SU
ju
1 row selected.
SQL> select substr(‘juliano’,13,1) from dual;
S
1 row selected.
SQL> select substr(‘juliano’,-10,100) from dual;
S
1 row selected.
SQL> select substr(‘123’,1,5) from dual;
SUB
123
1 row selected.
SQL> select substr(‘123’,1) from dual;
SUB
123
1 row selected.
otaviofcs
Prezado mister_m,
Eu sei o que é um objeto Date, o que faltou foi uma representação de sarcasmo tipo :shock: . :lol:
discorda não, concorda. Concorda que o objeto date deveria ser minimamente funcional ou apenas armazenar os milisegundos sem fazer mais nada. Do jeito que foi feito, virou zé da cuica
[quote=mister__m]
sql.Date é uma data “humana” com dia, mês e ano somente. Existe porque nada mais no Java representa isso.
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.
Também sei o que é um java.sql.Date, mas a existência do mesmo é algo estúpido! E quanto a existência de primitivos, para mim ou tem todos os básicos (e aí tem que ter o date) ou era melhor não ter. Esse era meu ponto.
Escreverei melhor na próxima vez para não deixar dúvidas do que penso .
abraços,
otávio
P
paulohrl
Concordo que soa estranho o fato de um ser inclusive o outro exclusive, mas a explicação de ser pela posição do cursos foi a melhor de todas, senão a única real explicação, ja que a maioria só repetiu como funciona.
Que fique claro que isso não é uma crítica ao post de ninguém, mas um elogio ao do shison.