Bom dia, galera
Estou tentando inserir dados em uma arraylist porem quando vou conferir pra saber se ja existe ele exibe um erro, quando a arraylist esta vazia inseri de boa, mas no if que compara se é igual ou nao ele da erro mostrado abaixo do codigo…Poderiam me ajudar… Obrigado
public void inserir (String ingles, String port){
int i = 0;
if(this.port.isEmpty() == true){
this.ingles.add(ingles);
this.port.add(port);
JOptionPane.showMessageDialog(null,“Tradução Cadastrada”);
}
else{
while(i < this.port.size() && !this.port.get(i).equals(port))
i++;
Exception in thread “main” java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
at java.util.ArrayList.rangeCheck(ArrayList.java:604)
at java.util.ArrayList.get(ArrayList.java:382)
at exerdicionario.Dicionario.inserir(Dicionario.java:45)
at exerdicionario.ExerDicionario.main(ExerDicionario.java:25)
Java Result: 1[quote][/quote]
Utilize as tags [code] para colocar código nos tópicos.
Pois bem, tirando raras exceções, todas as contagens do java começam em 0 (collections, arrays). Logo, quando você insere um elemento em uma lista vazia, está colocando o mesmo na posição zero.
Quando você itera, usando o while e incrementa o contador (não sei por que um contador em um while, mas tudo bem) e em seguida tenta acessar a iésima posição da lista, está acessando uma posição inexistente.
Sinta-se à vontade para perguntar sempre que precisar
e não sinta acanhado quando encontrar alguns usuários
que não lhe responderem de forma adequada ou sem paciência.
Bom vamos agora ao que interessa para uma possível ajuda mais nítida ao teu caso.
Mudei algumas coisas no seu código para poder rodar aqui e te exemplificar
o meu código ficou como mostro abaixo:
Lembrando que eu fiz algumas alterações no teu código para
que eu conseguisse executar ele aqui.
No entanto meu objetivo foi de apenas clarear um pouco as coisas
para ver se resolve o seu problema.
Se não resolver o problema, peço por favor que poste o código completo
da suas classes para eu compilar aqui e poder ajudar com mais foco.
/*
To change this template, choose Tools | Templates
and open the template in the editor.
*/
package comparador;
Muito Obrigado pela recepção ao GUJ comecei aprender java nesse semestre na faculdade, estou no 4º Termo de Sistemas de Informação da Faculdade de Informatica de Presidente Prudente (FIPP), vou seguir sua dica aqui no código e já agradeço pela ajuda.
lagisk, o código do JavaDreams está errado. Ele entrará em um loop infinito, pois ele cometeu alguns erros bem feios.
1º não delimitou o while com as chaves, fazendo com que o mesmo só execute a primeira instrução que o segue, no caso, o if. Como o while depende do incremento da variável i para funcionar corretamente e este trecho não será atingido, pois ele ficou fora do laço while, você nunca sairá do loop até a memória estourar ou você interromper o processo à força.
Colocando as chaves que delimitam o laço, o problema persiste, pois, mesmo com o incremento da variável i, a condição de saída do while nunca será satisfeita. Como assim? Veja que ele condicionou a permanência no laço à duas condições lógicas: que a variável i seja menor que o tamanho da String arrayIngles e que a iésima posição desta lista seja igual ao valor informado na variável port.
Não sei em qual o nível de conhecimento a respeito de coleções você se encontra, mas, creio que não seria necessário percorrer as listas para isso. A interface List possui um método chamado contains que retorna true caso o objeto comparado já exista na mesma e false caso não exista
[quote=drsmachado]lagisk, o código do JavaDreams está errado. Ele entrará em um loop infinito, pois ele cometeu alguns erros bem feios.
1º não delimitou o while com as chaves, fazendo com que o mesmo só execute a primeira instrução que o segue, no caso, o if. Como o while depende do incremento da variável i para funcionar corretamente e este trecho não será atingido, pois ele ficou fora do laço while, você nunca sairá do loop até a memória estourar ou você interromper o processo à força.
Colocando as chaves que delimitam o laço, o problema persiste, pois, mesmo com o incremento da variável i, a condição de saída do while nunca será satisfeita. Como assim? Veja que ele condicionou a permanência no laço à duas condições lógicas: que a variável i seja menor que o tamanho da String arrayIngles e que a iésima posição desta lista seja igual ao valor informado na variável port.
Não sei em qual o nível de conhecimento a respeito de coleções você se encontra, mas, creio que não seria necessário percorrer as listas para isso. A interface List possui um método chamado contains que retorna true caso o objeto comparado já exista na mesma e false caso não exista
[quote=JavaDreams][quote=drsmachado]lagisk, o código do JavaDreams está errado. Ele entrará em um loop infinito, pois ele cometeu alguns erros bem feios.
1º não delimitou o while com as chaves, fazendo com que o mesmo só execute a primeira instrução que o segue, no caso, o if. Como o while depende do incremento da variável i para funcionar corretamente e este trecho não será atingido, pois ele ficou fora do laço while, você nunca sairá do loop até a memória estourar ou você interromper o processo à força.
Colocando as chaves que delimitam o laço, o problema persiste, pois, mesmo com o incremento da variável i, a condição de saída do while nunca será satisfeita. Como assim? Veja que ele condicionou a permanência no laço à duas condições lógicas: que a variável i seja menor que o tamanho da String arrayIngles e que a iésima posição desta lista seja igual ao valor informado na variável port.
Não sei em qual o nível de conhecimento a respeito de coleções você se encontra, mas, creio que não seria necessário percorrer as listas para isso. A interface List possui um método chamado contains que retorna true caso o objeto comparado já exista na mesma e false caso não exista
Isso resolve o problema da comparação e você ainda pode remover o while e o if que verifica se as listas estão vazias.[/quote]
Só lembrando o que eu disse anteriormente…
Mexi no seu código para tentar clarear um pouco as coisas, ou seja:
Não testei nem implementei tudo para ver se estava perfeitamente correto
pois não tenho todo o código.
Mas como não vejo motivos para argumentar sobre isso, fica aqui meu parecer
e o resto vou ignorar.
Abraço.[/quote]
O código todo era aquele, o que mais precisa? Penso que você está se esquivando da responsabilidade por ter fornecido uma resposta incorreta e levando o autor do tópico e eventuais visitantes do tópico a seguir um conselho errado.
Admitir que errou é uma das coisas mais nobres que um ser humano pode fazer e é o primeiro passo para entender que pode aprender mais.
Ao invés de tudo o que sugeriu e do código que “não testou”, poderia ter sido mais simplista e direto, dando o caminho para ele pensar e não um código pronto (e errado).
Admita, você errou, isso não é vergonha, mesmo por que, você mesmo disse
[quote=JavaDreams]
Mudei algumas coisas no seu código para poder rodar aqui e te exemplificar
[/quote] e agora está negando uma coisa que você mesmo escreveu.
[quote=drsmachado][quote=JavaDreams][quote=drsmachado]lagisk, o código do JavaDreams está errado. Ele entrará em um loop infinito, pois ele cometeu alguns erros bem feios.
1º não delimitou o while com as chaves, fazendo com que o mesmo só execute a primeira instrução que o segue, no caso, o if. Como o while depende do incremento da variável i para funcionar corretamente e este trecho não será atingido, pois ele ficou fora do laço while, você nunca sairá do loop até a memória estourar ou você interromper o processo à força.
Colocando as chaves que delimitam o laço, o problema persiste, pois, mesmo com o incremento da variável i, a condição de saída do while nunca será satisfeita. Como assim? Veja que ele condicionou a permanência no laço à duas condições lógicas: que a variável i seja menor que o tamanho da String arrayIngles e que a iésima posição desta lista seja igual ao valor informado na variável port.
Não sei em qual o nível de conhecimento a respeito de coleções você se encontra, mas, creio que não seria necessário percorrer as listas para isso. A interface List possui um método chamado contains que retorna true caso o objeto comparado já exista na mesma e false caso não exista
Isso resolve o problema da comparação e você ainda pode remover o while e o if que verifica se as listas estão vazias.[/quote]
Só lembrando o que eu disse anteriormente…
Mexi no seu código para tentar clarear um pouco as coisas, ou seja:
Não testei nem implementei tudo para ver se estava perfeitamente correto
pois não tenho todo o código.
Mas como não vejo motivos para argumentar sobre isso, fica aqui meu parecer
e o resto vou ignorar.
Abraço.[/quote]
O código todo era aquele, o que mais precisa? Penso que você está se esquivando da responsabilidade por ter fornecido uma resposta incorreta e levando o autor do tópico e eventuais visitantes do tópico a seguir um conselho errado.
Admitir que errou é uma das coisas mais nobres que um ser humano pode fazer e é o primeiro passo para entender que pode aprender mais.
Ao invés de tudo o que sugeriu e do código que “não testou”, poderia ter sido mais simplista e direto, dando o caminho para ele pensar e não um código pronto (e errado).
Admita, você errou, isso não é vergonha, mesmo por que, você mesmo disse
[quote=JavaDreams]
Mudei algumas coisas no seu código para poder rodar aqui e te exemplificar
[/quote] e agora está negando uma coisa que você mesmo escreveu.
Como você fez rodar e nem testou nem implementou?[/quote]
Por favor peço para algum moderador orientar o usuário drsmachado
pois sinto que a intenção das mensagens dele nesse post não sejam
de atender ao assunto do post, mas sim de procurar um meio
equivocado de gerar atrito.
Mesmo justificando meu ponto de vista, tentando ajudar o usuário
e assumindo que não tive tempo para testar todas as possibilidades
pois respondo ao fórum do meu trabalho, o usuário insiste em ficar provocando
ou me expondo pegando meus erros e comentando.
De fato não vou me ater ao detalhe de me “inflamar” no post, mas na íntegra
gostaria que providências fossem tomadas com relação ao comportamento dele
que persisti em rumar para outras direções a não ser a que tem por objetivo
ajudar o assunto do fórum.
desde já agradeço a atenção e aguardo providências
visto que não estou fazendo nada igual ao comportamento do drsmachado
Caso seja estritamente necessário iterar sobre as listas, pode fazer conforme o código abaixo.
Lembro que essa prática de fornecer o código fonte é errada, afinal, você pode acostumar-se com o ctrl + c/ctrl + v e acabar não aprendendo nada. O ideal é que você estude, pense, entenda a lógica de funcionamento e então consiga criar o teu próprio código.
package br.com.naptec.jv;
import java.util.ArrayList;
import java.util.List;
public class Dicionario {
private List<String> englishWords;
private List<String> portugueseWords;
public Dicionario() {
englishWords = new ArrayList<String>();
portugueseWords = new ArrayList<String>();
}
public void inserir(String ptBr, String enUs){
if(englishWords.isEmpty()){
englishWords.add(enUs);
portugueseWords.add(ptBr);
} else {
laco:
for(int i = 0; i < englishWords.size(); i++){
if(englishWords.get(i).equals(enUs)){//Se existir a palavra, não adiciona
break laco;
} if((i + 1) == englishWords.size()){//Se não existir e é o último elemento, adiciona
englishWords.add(enUs);
portugueseWords.add(ptBr);
}
}
}
for(int i = 0; i < englishWords.size(); i++){
String en = englishWords.get(i);
String pt = portugueseWords.get(i);
System.out.println(en);
System.out.println(pt);
}
}
public static void main(String[] args) {
Dicionario d = new Dicionario();
d.inserir("Avião", "Airplane");
d.inserir("Carro", "Car");
d.inserir("Diversão", "Fun");
d.inserir("Carro", "Car");
}
}
A alternativa, utilizando o método contains para verificar se o valor a ser inserido existe ou não na lista:
package br.com.naptec.jv;
import java.util.ArrayList;
import java.util.List;
public class Dicionario {
private List<String> englishWords;
private List<String> portugueseWords;
public Dicionario() {
englishWords = new ArrayList<String>();
portugueseWords = new ArrayList<String>();
}
public void inserir(String ptBr, String enUs){
if(!englishWords.contains(enUs)){
englishWords.add(enUs);
portugueseWords.add(ptBr);
}
for(int i = 0; i < englishWords.size(); i++){
String en = englishWords.get(i);
String pt = portugueseWords.get(i);
System.out.println(en);
System.out.println(pt);
}
}
public static void main(String[] args) {
Dicionario d = new Dicionario();
d.inserir("Avião", "Airplane");
d.inserir("Carro", "Car");
d.inserir("Diversão", "Fun");
d.inserir("Carro", "Car");
}
}
E um mais elegante, com uso de Set, que por si só não permite a duplicidade na inserção de valores
package br.com.naptec.jv;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;
public class Dicionario {
private Set<String> englishWords;
private Set<String> portugueseWords;
public Dicionario() {
englishWords = new LinkedHashSet<String>();
portugueseWords = new LinkedHashSet<String>();
}
public void inserir(String ptBr, String enUs){
englishWords.add(enUs);
portugueseWords.add(ptBr);
Iterator<String> ew = englishWords.iterator();
Iterator<String> pw = portugueseWords.iterator();
while(ew.hasNext() && pw.hasNext()){
String en = ew.next();
String pt = pw.next();
System.out.println(en);
System.out.println(pt);
}
}
public static void main(String[] args) {
Dicionario d = new Dicionario();
d.inserir("Avião", "Airplane");
d.inserir("Carro", "Car");
d.inserir("Diversão", "Fun");
d.inserir("Carro", "Car");
d.inserir("Diversão", "Fun");
d.inserir("Avião", "Airplane");
}
}
O detalhe neste último código é o uso de LinkedHashSet como implementação que fornecerá as instâncias para os objetos de Set. Essa implementação garante que a saída terá a mesma ordenação da entrada dos dados (sim, uma fila, FIFO - First In, First Out).
Observação:
não podemos entender como “errado” uma prática de ctrl c ou ctrl v,
caso contrário estaria listado nas regras.
Acredito que o GUJ se reserva no direito a não fazer tais
indagações ou se preocupar com este assunto, pois é
assunto que depende da índole de cada um e no final
acaba igual discussão de time de futebol, fugindo totalmente
do objetivo da comunidade que é ajudar uns aos outros.
Por favor fique à vontade para usar meus código fontes e também
os de outros Posts como bem entender e caso tiver alguma dúvida
sobre se algo é certo ou errado, se dirija a um dos moderadores
ou administradores, pois quando preciso pergunto para eles
e eles tiram todas as minhas dúvidas.
Vale ressaltar que o lembrete do drsmachado
é muito bom no sentido em que se entende a necessidade
de você pegar o código e entender o que está acontecendo nele.
Agradeço pelos comentários pois é sempre bom para aprender e corrigir erros.
Por favor se sua dúvida já foi esclarecida, coloque [RESOLVIDO]
na frente do título do seu tópico.
Observação:
não podemos entender como “errado” uma prática de ctrl c ou ctrl v,
caso contrário estaria listado nas regras.
Acredito que o GUJ se reserva no direito a não fazer tais
indagações ou se preocupar com este assunto, pois é
assunto que depende da índole de cada um e no final
acaba igual discussão de time de futebol, fugindo totalmente
do objetivo da comunidade que é ajudar uns aos outros.
Por favor fique à vontade para usar meus código fontes e também
os de outros Posts como bem entender e caso tiver alguma dúvida
sobre se algo é certo ou errado, se dirija a um dos moderadores
ou administradores, pois quando preciso pergunto para eles
e eles tiram todas as minhas dúvidas.
Vale ressaltar que o lembrete do drsmachado
é muito bom no sentido em que se entende a necessidade
de você pegar o código e entender o que está acontecendo nele.
Agradeço pelos comentários pois é sempre bom para aprender e corrigir erros.
Por favor se sua dúvida já foi esclarecida, coloque [RESOLVIDO]
na frente do título do seu tópico.
Abração.[/quote]
CTRL + C e CTRL + V não é uma prática errada no que tange ao fórum. Porém, quando falamos de aprendizado, é estritamente errada e inconveniente.
Qualquer pedagogo(a) irá te dizer isso de forma mais clara que eu (minha formação não contemplou pedagogia ou técnicas pedagógicas, visto que não sou licenciado, apenas bacharel).
Usar um código copiado inibe a construção de questões chave, como as que permitem indagar sobre o funcionamento de um determinado texto ou, no nosso caso, código fonte.
Isso é um atraso e não uma evolução, pois quando você copia à mão, você se vê obrigado a ler e, no mínimo, tentar interpretar o que está copiando.
É a isso que me refiro.
Além do mais, quando em uma prova para um emprego (ou mesmo na faculdade), creio que seja bem difícil existir um lugar do qual será possível realizar a cópia do conteúdo solicitado.
Por isso, mais uma vez ressalto, é fundamental entender o que está fazendo, não apenas copiar. E, assim sendo, é uma responsabilidade maior ainda a de quem responde um tópico no intuito de ajudar e coloca o código completo. Na grande maioria dos casos isso apenas atrapalha, atrasa o aprendizado das pessoas.
E como resolver isso, então?
Ensine a pesquisar, a pensar, a estudar, a ver o problema/situação a partir de diferentes pontos de vista.
Desculpa se não fui 100% correto e se ficou como erro meu código, mas isso acontece
pois são muitos posts, e tive o intuito de ajudar como foco principal.
Aproveita para debugar a aplicação e entender os caminhos
e os porquês de cada coisa.
Vale ressaltar que quis usar uma maneira simples
de mostrar um caminho, mas em momento nenhum
disse que era a melhor ou 100% correta pois o tempo não
me permitia checar isso.
Aliás ressalto mais uma vez que
as regras do GUJ não excluem pessoas que por ventura
postem código com algum tipo de erro sem perceber(afinal são seres humanos), pois reconhecem
primeiramente a boa índole dos que querem ajudar com boa vontade.
Sendo assim vez por outra encontramos algumas soluções nos posts que podem
ter algum tipo de erro ou não. Afinal se fomos fazer a fórmula perfeita
igual algumas pessoas o fazem por aí, acredito que o GUJ vai ficar burocrático
igual sistema público.
Sobre o resto, como de praxe sigo ignorando pois não adiciona nada
a não ser querer ibope.
Abraço e coloca RESOLVIDO na frente do seu post por favor para que
ajude as pessoas a saber que uma solução foi encontrada para o teu problema.
Desculpa se não fui 100% correto e se ficou como erro meu código, mas isso acontece
pois são muitos posts, e tive o intuito de ajudar como foco principal.
Aproveita para debugar a aplicação e entender os caminhos
e os porquês de cada coisa.
Vale ressaltar que quis usar uma maneira simples
de mostrar um caminho, mas em momento nenhum
disse que era a melhor ou 100% correta pois o tempo não
me permitia checar isso.
Aliás ressalto mais uma vez que
as regras do GUJ não excluem pessoas que por ventura
postem código com algum tipo de erro sem perceber(afinal são seres humanos), pois reconhecem
primeiramente a boa índole dos que querem ajudar com boa vontade.
Sendo assim vez por outra encontramos algumas soluções nos posts que podem
ter algum tipo de erro ou não. Afinal se fomos fazer a fórmula perfeita
igual algumas pessoas o fazem por aí, acredito que o GUJ vai ficar burocrático
igual sistema público.
Sobre o resto, como de praxe sigo ignorando pois não adiciona nada
a não ser querer ibope.
Abraço e coloca RESOLVIDO na frente do seu post por favor para que
ajude as pessoas a saber que uma solução foi encontrada para o teu problema.[/quote]
Cara, admite logo que o código que você fez estava errado e pronto. Segue a vida.
As regras do fórum não excluem ninguém por errar, mas é muito mais digno dizer que errou, para evitar que desavisados usem o teu código e encontrem mais dificuldades. É essa a minha preocupação.
Outra coisa, a burocracia só existe por que alguém não faz as coisas da forma adequada. Se todos seguissem as regras e fizessem o que se propõem a fazer da maneira mais adequada possível, a burocracia não existiria.
Desculpa se não fui 100% correto e se ficou como erro meu código, mas isso acontece
pois são muitos posts, e tive o intuito de ajudar como foco principal.
Aproveita para debugar a aplicação e entender os caminhos
e os porquês de cada coisa.
Vale ressaltar que quis usar uma maneira simples
de mostrar um caminho, mas em momento nenhum
disse que era a melhor ou 100% correta pois o tempo não
me permitia checar isso.
Aliás ressalto mais uma vez que
as regras do GUJ não excluem pessoas que por ventura
postem código com algum tipo de erro sem perceber(afinal são seres humanos), pois reconhecem
primeiramente a boa índole dos que querem ajudar com boa vontade.
Sendo assim vez por outra encontramos algumas soluções nos posts que podem
ter algum tipo de erro ou não. Afinal se fomos fazer a fórmula perfeita
igual algumas pessoas o fazem por aí, acredito que o GUJ vai ficar burocrático
igual sistema público.
Sobre o resto, como de praxe sigo ignorando pois não adiciona nada
a não ser querer ibope.
Abraço e coloca RESOLVIDO na frente do seu post por favor para que
ajude as pessoas a saber que uma solução foi encontrada para o teu problema.[/quote]
Cara, admite logo que o código que você fez estava errado e pronto. Segue a vida.
As regras do fórum não excluem ninguém por errar, mas é muito mais digno dizer que errou, para evitar que desavisados usem o teu código e encontrem mais dificuldades. É essa a minha preocupação.
Outra coisa, a burocracia só existe por que alguém não faz as coisas da forma adequada. Se todos seguissem as regras e fizessem o que se propõem a fazer da maneira mais adequada possível, a burocracia não existiria.[/quote]
Ao dono do post minhas sinceras desculpas pelo meu erro.
Errar é humano e várias pessoas já erraram aqui no GUJ
mesmo querendo ajudar.
Parabéns por ter conseguido usar o contais e ter resolvido
seu problema. Afinal a solução do drsmachado foi muito boa mesmo.
Sobre os comentários do drsmachado vou seguir ignorando
assim como já fui instruído anteriormente a fazer pois senão
poderei entrar em confusão e também ser banido.
Vou me ater ao silêncio pois não quero ser banido do fórum, mas ressalto que
drsmachado tome cuidado com suas mensagens
pois alguns usuários já reclamaram até comigo que sou usuário normal, com relação da maneira
como você aborda determinadas coisas, chegando a ver até insultos graves seus em alguns posts
usando até palavras chulas.
Adianto que como as regras dizem desrespeitar as regras e outros usuários em qualquer hipótese
poderá ser relatado para a Adm por qualquer usuário que se sinta ofendido
ou insultado, sendo que o violador poderá ser expulso da comunidade tendo sua conta bloqueada.
Não sou adm mas conheço as regras e posso denunciar também.
Aliás vou mudar minha assinatura colocando links para pessoas poderem ver as regras do GUJ
e denunciar quando precisarem.