Strings em ordem alfabética

25 respostas
M

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.

25 Respostas

somma

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

alexandreaw

Faz assim:

Object[] data = {"Kiwi","Banana","Mango","Aubergine","Strawberry"};
List list = Arrays.asList(data);
Collections.sort(list);
System.out.println(list);

// Resultado [Aubergine, Banana, Kiwi, Mango, Strawberry]
T

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:

import java.util.*;
...
SortedSet<String> ss =  new TreeSet<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

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

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
ArrayList nomeList = new ArrayList();
Scanner sc = new Scanner(System.in);

System.out.println("Digite o nome: ");
String nome = sc.nextLine();

nomeList.add(nome);
M

Valeu Pimento , isso ajudou bastante.

eu fiz isso :

import java.util.*;
public class Alunos {
	public static void main (String[] args) {

		ArrayList Alunos = new ArrayList();
		Scanner sc = new Scanner(System.in);
		
		 for( ; ; ) {

		  System.out.println("Digite o nome: ");
		  String nome = 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

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

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

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:

import java.util.*;
import javax.swing.*;
public class Alunos {
	public static void main (String[] args) {

		ArrayList Alunos = new ArrayList();
		ArrayList Nota1 = new ArrayList();
				
		String nome;
		String nota;
		
		
		 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

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

Estão ocorrendo alguns erros:

import java.util.*;
import javax.swing.*;
public class Alunos {
	public static void main (String[] args) {

		ArrayList Alunos = new ArrayList();
		ArrayList Nota1 = new ArrayList();
		ArrayList Nota2 = new ArrayList();
		
		String nome;
		int nota1;
		
		
		 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(int i = 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(int ii = 0; ii<= Alunos.size(); ii++){
				JOptionPane.showMessageDialog(null, "Aluno " + Alunos[ii] + " tem a nota " + Nota1[ii]); // erro em "Alunos[ii] e Nota1[i]	
			}
		 
		
		 

  }
}
M

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…

import java.util.*;
import javax.swing.*;
public class Alunos {
	public static void main (String[] args) {

		ArrayList Alunos = new ArrayList();
		ArrayList Nota1 = new ArrayList();
		ArrayList Nota2 = new ArrayList();
		
		String nome;
		int nota1;
		
		
		 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(int i = 0; i<= Alunos.size(); i++){
				nota1 = Integer.parseInt(JOptionPane.showInputDialog(null, "Informe a nota do aluno " + Alunos.get(i)));
				Nota1.add(nota1);
			}
		  
		 for(int ii = 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:
StringBuffer sb = new StringBuffer();

for (int i = 0; i<= Alunos.size(); i++){
   sc.append("Aluno " + Alunos.get(ii) + " tem a nota " + Nota1.get(ii) + "\n");
}

String s = 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
pimenta:
Bota o Collections.sort(Alunos); fora do for... Na hora de imprimir tenta assim:
StringBuffer sb = new StringBuffer();

for (int i = 0; i<= Alunos.size(); i++){
   sc.append("Aluno " + Alunos.get(ii) + " tem a nota " + Nota1.get(ii) + "\n");
}

String s = 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

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:

import java.util.*;
import javax.swing.*;
public class Alunos {
	public static void main (String[] args) {

		ArrayList Alunos = new ArrayList();
		ArrayList Nota1 = new ArrayList();
		ArrayList Nota2 = new ArrayList();
		ArrayList Media = new ArrayList();
		
		String nome;
		double nota1, 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(int i = 0; i<= Alunos.size(); i++){
		   nota1 = Double.parseDouble(JOptionPane.showInputDialog(null, "Informe a nota do aluno " + Alunos.get(i)));
		   Nota1.add(nota1);
		   		   
		 }
		 
		 
		 for(int i = 0; i<= Alunos.size(); i++){
		   nota2 = Double.parseDouble(JOptionPane.showInputDialog(null, "Informe a segunda nota do aluno " + Alunos.get(i)));
		   Nota2.add(nota2);
		 }
		 
		 
		 for(int i = 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:

Exception in thread main java.lang.IndexOutOfBoundsException: Index: 3, Size: 3

at java.util.ArrayList.RangeCheck(Unknown Source)

at java.util.ArrayList.get(Unknown Source)

at Alunos.main(Alunos.java:28)
M

A solução foi trocar o <= do for por apenas <

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!

Criado 27 de maio de 2008
Ultima resposta 27 de mai. de 2008
Respostas 25
Participantes 8