Olá,
Quero criar um aplicativo que leia vários nomes e apresente-os em ordem alfabética. Primeira dúvida- eu não sei quantos nomes serão lidos, logo não posso criar um determinado número de variáveis para armazenar esses nomes, como guardá-los ?
Segunda dúvida - como mostrar esses nomes em ordem alfabética ?
Observação : Não quero código pronto, apenas ajuda, muito obrigado à todos, um abraço.
Primeira dúvida- eu não sei quantos nomes serão lidos, logo não posso criar um determinado número de variáveis para armazenar esses nomes, como guardá-los ?
Resposta: Você pode criar um Array de Strings, ou um ArrayList, assim vc vai inserindo sem precisar saber o qtde.
Segunda dúvida - como mostrar esses nomes em ordem alfabética ?
Resposta: Ao criar a rotina para ler este Array, deve ter alguma função lá que ordena os dados… eu não me lembro muito bem o nome
Para a solução dos dois problemas, existe uma estrutura de dados pronta no Java, chamada SortedSet. (java.util.SortedSet). Ela armazena os nomes em ordem alfabética, e não tem limitação para o número de nomes.
Exemplo de uso:
importjava.util.*;...SortedSet<String>ss=newTreeSet<String>();ss.add("Luis Inacio");ss.add("Fernando Henrique");ss.add("Jose Serra");ss.add("Carlos Apolinario");ss.add("Amadeu Aguiar");...System.out.println(ss);// deve imprimir algo como:// {Amadeu Aguiar, Carlos Apolinario, Fernando Henrique, Jose Serra, Luis Inacio}
Rafael_Nunes
Use um TreeSet(ele não vai permitir duplicidade).
Se houver duplicidade, use como citado acima um ArrayList e depois Collections.sort(List) para ordená-los.
pimenta
Primeira dúvida - Usa um ArrayList pra você poder adicionar e remover itens dinâmicamente.
Segunda dúvida - Use Collection.sort(List) pra ordenar sua lista.
Abraços,
M
mid_
Certo, mas o usuário que digitará os nomes, como fazer com que os nomes que o usuário digitar sejam armazenados ?
Obrigado pela atenção.
M
mid_
Nunca usei nem sei usar ArraysList, vou pesquisar algo sobre, obrigado pelas informações, abraços.
marcosbrandao
Se você quiser aprender um pouco mais, para que em alguma outra situação precisar fazer ordenação de uma maneira diferente, de uma olhada em Comparator ou Comparable, implemente elas e passe no metodo sort do seu ArrayList.
Assim você pode ordenar da maneira que quiser…
pimenta
ArrayListnomeList=newArrayList();Scannersc=newScanner(System.in);System.out.println("Digite o nome: ");Stringnome=sc.nextLine();nomeList.add(nome);
M
mid_
Valeu Pimento , isso ajudou bastante.
eu fiz isso :
importjava.util.*;publicclassAlunos{publicstaticvoidmain(String[]args){ArrayListAlunos=newArrayList();Scannersc=newScanner(System.in);for(;;){System.out.println("Digite o nome: ");Stringnome=sc.nextLine();if(nome.equals("")){System.exit(0);}Alunos.add(nome);}Collections.sort(Alunos);System.out.println(Alunos);}}
mas a parte do Collections.sort está dando erro, provavelmente estou usando de forma errada, alguém pode me explicar como usá-la ?
M
mid_
Deu certo, o que estava errado não era o collections e sim o System.exit(0); troquei ele por break e deu certo.
Muito obrigado pela ajuda de todos.
M
mid_
Só mais uma dúvida, se por exemplo eu quiser mostrar na frente de cada aluno, uma média ( informada pelo usuário), há uma maneira de fazer isso ?
pimenta
Faça um segundo ArrayList chamado notasList ou qualquer outra coisa e peça para o usuário, logo depois de digitar o nome do aluno, digitar a nota.
Nota no índice 0 corresponde ao aluno no índice 0, nota no índice 1 corresponde ao aluno no índice 1, e assim sucessivamente…
Abraços,
M
mid_
Ok, eu tinha feito mais ou menos isso, pedi o nome e depois a nota, mas na hora de mandar mostrar os nomes seguidos das notas como eu faço para falar que ele o programa tem que mostrar primeiro o nome 0 seguido da nota 0, eu fiz assim, mas ele mostra primeiro os alunos, depois as notas:
importjava.util.*;importjavax.swing.*;publicclassAlunos{publicstaticvoidmain(String[]args){ArrayListAlunos=newArrayList();ArrayListNota1=newArrayList();Stringnome;Stringnota;for(;;){nome=JOptionPane.showInputDialog(null,"Digite o nome: ");nota=JOptionPane.showInputDialog(null,"Digite a nota: ");if(nome.equals("")){break;}Alunos.add(nome);Nota1.add(nota);}Collections.sort(Alunos);JOptionPane.showMessageDialog(null,Alunos+" "+Nota1);}}
pimenta
O sort aí gera um pequeno problemasso… Quando você organiza os nomes e não organiza as notas aquilo tudo que você digitou passa a não fazer sentido.
Acho que isso daria pra resolver implementando Comparator ou Comparable, mas eu faria da seguinte forma:
1- Armazeno na nomesList os nomes de todos os alunos.
2- Organizo os nomes.
3- Faço um for varrendo a nomesList pedindo pro usuário digitar a nota referente a cada aluno.
4- Imprimo o nome do aluno com a respectiva nota.
Pode ser mais trabalhoso(ou não), mas é assim que eu faria…
Abraços,
M
mid_
Entendi, no segundo for, quando vai mostrar o nome do aluno e pedir a nota, como eu faço para mostrar o nome do aluno1 depois o aluno2 , e aí por diante, e pedir as notas?
ps.: ao final tem que mostrar uma lista com o nome dos alunos e as notas.
pimenta
Pegar notas:
for(int i = 0; nomesList.size(); i++){
System.out.println("Informe a nota do aluno " + nomesList[i]);
notaList[i] = //recebe nota
}
Informar lista com nome e nota:
for(int i = 0; nomesList.size(); i++){
System.out.println("Aluno " + nomesList[i] + " tem a nota " + notasList[i]);
}
Vê se isso te resolve…
Abraços,
M
mid_
Estão ocorrendo alguns erros:
importjava.util.*;importjavax.swing.*;publicclassAlunos{publicstaticvoidmain(String[]args){ArrayListAlunos=newArrayList();ArrayListNota1=newArrayList();ArrayListNota2=newArrayList();Stringnome;intnota1;for(;;){nome=JOptionPane.showInputDialog(null,"Informe o nome do aluno ou aperte <Enter> com o campo em branco para encerrar o programa: ");if(nome.equals("")){break;}Alunos.add(nome);}for(inti=0;i<=Alunos.size();i++){nota1=Integer.parseInt(JOptionPane.showInputMessage(null,"Informe a nota do aluno "+Alunos[i]));// dá erro nesse "Aluno[i]"Nota1[i]=nota1;// erro em Nota1[i]}Collections.sort(Alunos);for(intii=0;ii<=Alunos.size();ii++){JOptionPane.showMessageDialog(null,"Aluno "+Alunos[ii]+" tem a nota "+Nota1[ii]);// erro em "Alunos[ii] e Nota1[i] }}}
M
mid_
Mudei algumas coisas e acho que resolveu alguns problemas, mas depois de pedir o nome e anota ele sai do programa sem informar “fulando tem a nota x”.
Se alguém identificar o que está ocorrendo…
importjava.util.*;importjavax.swing.*;publicclassAlunos{publicstaticvoidmain(String[]args){ArrayListAlunos=newArrayList();ArrayListNota1=newArrayList();ArrayListNota2=newArrayList();Stringnome;intnota1;for(;;){nome=JOptionPane.showInputDialog(null,"Informe o nome do aluno ou aperte <Enter> com o campo em branco para encerrar o programa: ");if(nome.equals("")){break;}Alunos.add(nome);Collections.sort(Alunos);}for(inti=0;i<=Alunos.size();i++){nota1=Integer.parseInt(JOptionPane.showInputDialog(null,"Informe a nota do aluno "+Alunos.get(i)));Nota1.add(nota1);}for(intii=0;ii<=Alunos.size();ii++){JOptionPane.showMessageDialog(null,"Aluno "+Alunos.get(ii)+" tem a nota "+Nota1.get(ii));}}}
pimenta
Bota o Collections.sort(Alunos); fora do for...
Na hora de imprimir tenta assim:
StringBuffersb=newStringBuffer();for(inti=0;i<=Alunos.size();i++){sc.append("Aluno "+Alunos.get(ii)+" tem a nota "+Nota1.get(ii)+"\n");}Strings=sc.toString();JOptionPane.showMessageDialog(null,s);
Vê se funciona..
Abraços,
renatocustodio
Bom, acho que pra evitar problemas o mais certo nesse caso era criar uma classe Aluno que tem Nome e Nota como atributos. Então implementar a interface comparable, assim poderia usar normalmente o método sort()…
M
mid_
pimenta:
Bota o Collections.sort(Alunos); fora do for...
Na hora de imprimir tenta assim:
StringBuffersb=newStringBuffer();for(inti=0;i<=Alunos.size();i++){sc.append("Aluno "+Alunos.get(ii)+" tem a nota "+Nota1.get(ii)+"\n");}Strings=sc.toString();JOptionPane.showMessageDialog(null,s);
Vê se funciona..
Abraços,
Fiz as alterações e o problema continua.
pimenta
Qual é o problema exatamente, cara?
Qual erro, exatamente, que está dando?
Coloca o código completo aí…
M
mid_
O erro é que após pedir a segunda nota, o programa é encerrado, não acontece mais nada, não aparece nenhuma mensagem de erro, apenas é fechado, o código é aquele que eu postei no outro post, vou colocar aqui novamente:
importjava.util.*;importjavax.swing.*;publicclassAlunos{publicstaticvoidmain(String[]args){ArrayListAlunos=newArrayList();ArrayListNota1=newArrayList();ArrayListNota2=newArrayList();ArrayListMedia=newArrayList();Stringnome;doublenota1,nota2;for(;;){nome=JOptionPane.showInputDialog(null,"Informe o nome do aluno ou aperte <Enter> com o campo em branco para encerrar o programa: ");if(nome.equals("")){break;}Alunos.add(nome);}Collections.sort(Alunos);for(inti=0;i<=Alunos.size();i++){nota1=Double.parseDouble(JOptionPane.showInputDialog(null,"Informe a nota do aluno "+Alunos.get(i)));Nota1.add(nota1);}for(inti=0;i<=Alunos.size();i++){nota2=Double.parseDouble(JOptionPane.showInputDialog(null,"Informe a segunda nota do aluno "+Alunos.get(i)));Nota2.add(nota2);}for(inti=0;i<=Alunos.size();i++){JOptionPane.showMessageDialog(null,"Aluno "+Alunos.get(i)+" Primeira nota: "+Nota1.get(i)+" Segunda nota: "+Nota2.get(i));}}}
Obrigado pela atenção, abraços.
Complementando, aparece a seguinte mensagem no console:
Não é bem um problema, mas um incômodo, que gostaria de saber se tem como resolver:
Ao apresentar o nome e nota dos alunos, o programa mostra um de cada vez, não teria como mostrar na mesma janela todos os nomes e notas ?
É um pouco estranho ter que ficar clicando em OK para ter que ver a nota do próximo aluno.
Muito obrigado pela ajuda de quem postou, me ajudou bastante. abraços!