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}
R
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.
P
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.
M
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…
P
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 ?
P
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);}}
P
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.
P
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));}}}
P
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,
R
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.
P
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!