[RESOLVIDO] Ordenando array de string

Oi,

Dei uma pesquisada aqui antes e não achei nada que me ajude, e tambem estou num caso bem especifico. O exercicio pede que eu crie um vetor(array) de string e ordene eles. Só que não posso usar Arraysort, tem que ser na mão mesmo.

O que eu fiz foi o seguinte, aqui vai um treixo do algoritmo.

...
for (int i = 0; i < n.length; i++) {

			nome[i] = JOptionPane.showInputDialog("Nome");
			idade[i] = Integer.parseInt(JOptionPane.showInputDialog("Idade"));
			sexo[i] = JOptionPane.showInputDialog("Sexo M/F").charAt(0);
}
...

int questao = Integer.parseInt(JOptionPane.showInputDialog("Ordenar por nome: 1"
							+ " \nOrdenar por idade: 2"
							+ "\nFazer busca por nome: 3"
							+ " \nNome do mais idoso: 4 "
							+ "\nMedia da idade dos homens: 5"
							+ "\nTotal de mulheres: 6"));

			if (questao == 1) {

				String nomeAux;
				int idadeAux;
				char sexoAux;

				for (int i = 0; i < nome.length; i++) {

					for (int j = 0; j < nome.length - i - 1; j++) {

						if (nome[j].charAt(0) == nome[j + 1].charAt(0)) {

							if (nome[j].length() <= nome[j + 1].length()) {

								for (int k = 1; k < nome[j].length(); k++) {

									if (nome[j].charAt(k) > nome[j + 1]
											.charAt(k)) {
										nomeAux = nome[j + 1];
										nome[j + 1] = nome[j];
										nome[j] = nomeAux;

										idadeAux = idade[j + 1];
										idade[j + 1] = idade[j];
										idade[j] = idadeAux;

										sexoAux = sexo[j + 1];
										sexo[j + 1] = sexo[j];
										sexo[j] = sexoAux;

									}
								}
							} else {
								for (int k = 1; k < nome[j+1].length(); k++) {
									
									if (k == (nome[j+1].length()-1)) {
										
										if (nome[j].charAt(k) > nome[j+1].charAt(k)) { // problema aqui

											nomeAux = nome[j + 1];
											nome[j + 1] = nome[j];
											nome[j] = nomeAux;

											idadeAux = idade[j + 1];
											idade[j + 1] = idade[j];
											idade[j] = idadeAux;

											sexoAux = sexo[j + 1];
											sexo[j + 1] = sexo[j];
											sexo[j] = sexoAux;

										}
									} else {
										
										if (nome[j].charAt(k) > nome[j+1].charAt(k)) { // problemas aqui

											nomeAux = nome[j + 1];
											nome[j + 1] = nome[j];
											nome[j] = nomeAux;

											idadeAux = idade[j + 1];
											idade[j + 1] = idade[j];
											idade[j] = idadeAux;

											sexoAux = sexo[j + 1];
											sexo[j + 1] = sexo[j];
											sexo[j] = sexoAux;
										}
									}
								}
							}

						} else if (nome[j].charAt(0) > nome[j + 1].charAt(0)) {

							nomeAux = nome[j + 1];
							nome[j + 1] = nome[j];
							nome[j] = nomeAux;

							idadeAux = idade[j + 1];
							idade[j + 1] = idade[j];
							idade[j] = idadeAux;

							sexoAux = sexo[j + 1];
							sexo[j + 1] = sexo[j];
							sexo[j] = sexoAux;
						}
					}
				}
				for (int i = 0; i < nome.length; i++) {
					saida += "Nome: " + nome[i] + " " + idade[i]
							+ " anos sexo: " + sexo[i] + "\n";
				}
				JOptionPane.showMessageDialog(null, saida);

Tipo, Ele de cara ja ordena caso a primeira letra seja diferente, agora, estou tendo problemas para ordenar quando a palavra é quase igual. Não sei porque mas esta dando alguns problemas de outofbounds onde esta comentado “// problemas aqui” Primeiro eu não estou sabendo porque esta estourando o algoritmo.

É por causa dessa linha?

for (int j = 0; j < nome.length - i - 1; j++) {

E não estou conseguindo ordenar strings com mesmos caracteres e com tamanhos diferentes.
Por exemplo, na sequencia eu coloco: “aaaa”; “aaa”; “aa” e “a”. O programa não esta colocando os strings que tem menos caracteres em primeiro lugar,o resultado final esta dando:

nome[0] = aaaa
nome[1] = aaa
nome[2] = aa
nome[3] = a

Gostaria que fosse ao contrario mas não estou sabendo implementar isso.

Bom, se alguem puder me ajudar em alguma parte eu agradeço, estou tentando aqui.

vlw

Tenta este método:

umaString.compareTo(outraString); //ou umaString.compareToIgnoreCase(outraString);

Se retornar um inteiro positivo, significa que “umaString” vem depois de “outraString” (se for um inteiro negativo é o inverso), e se for zero, as strings são iguais.

Obrigado Eugenio, gostei desse comando, mais para frente vou usa-lo, mas acho que meu professor não vai aceitar porque antes eu apresentei esse mesmo exercicio com arraysort e ele mandou eu fazer denovo, acho que ele quer com if’s e elses e fors. :stuck_out_tongue:

O compareTo só fará a comparação. A ordenação em si ainda continuará com ifs e fors.

Sim, eu entendi, mas vou fazer inclusive as comparações com if e else. Não quero arriscar perder a nota pois ja estou tendo que refazer.

Mudei o Algoritmo para esse formato.

for (int i = 0; i < nome.length; i++) {

					for (int j = 0; j < nome.length - i - 1; j++) {

						if (nome[j].charAt(0) == nome[j + 1].charAt(0)) {

							if (nome[j].length() <= nome[j + 1].length()) {

								for (int k = 1; k < nome[j].length(); k++) {

									if (nome[j].charAt(k) > nome[j + 1].charAt(k)) {
										nomeAux = nome[j + 1];
										nome[j + 1] = nome[j];
										nome[j] = nomeAux;

										idadeAux = idade[j + 1];
										idade[j + 1] = idade[j];
										idade[j] = idadeAux;

										sexoAux = sexo[j + 1];
										sexo[j + 1] = sexo[j];
										sexo[j] = sexoAux;

									}
								}
							} else {
								for (int k = 1; k < nome[j + 1].length(); k++) {
									
									if (k != (nome[j + 1].length() - 1)) {
									
										if (nome[j].charAt(k) > nome[j + 1]
												.charAt(k)) { 

											nomeAux = nome[j + 1];
											nome[j + 1] = nome[j];
											nome[j] = nomeAux;

											idadeAux = idade[j + 1];
											idade[j + 1] = idade[j];
											idade[j] = idadeAux;

											sexoAux = sexo[j + 1];
											sexo[j + 1] = sexo[j];
											sexo[j] = sexoAux;

										}
									} else {
										//System.out.println(nome[j + 1].length() + " " + k);
										if (nome[j].charAt(k) >= nome[j + 1]
												.charAt(k)) { // problemas aqui

											nomeAux = nome[j + 1];
											nome[j + 1] = nome[j];
											nome[j] = nomeAux;

											idadeAux = idade[j + 1];
											idade[j + 1] = idade[j];
											idade[j] = idadeAux;

											sexoAux = sexo[j + 1];
											sexo[j + 1] = sexo[j];
											sexo[j] = sexoAux;
										}
									}

								}
							}

						} else if (nome[j].charAt(0) > nome[j + 1].charAt(0)) {

							nomeAux = nome[j + 1];
							nome[j + 1] = nome[j];
							nome[j] = nomeAux;

							idadeAux = idade[j + 1];
							idade[j + 1] = idade[j];
							idade[j] = idadeAux;

							sexoAux = sexo[j + 1];
							sexo[j + 1] = sexo[j];
							sexo[j] = sexoAux;
						}
					}
				}

Bom, o que ele faz:
Caso a ordem seja feita crescente, é tudo tranquilo, ele mantei os strings na ordem crescente. agora no caso em que tem que trocar porque a segunda string é menor, ele esta dando outofbounds nessa linha 50.
Esta bem simples, digamos que temos dois strings, o nome[j] = aaaa e o [j+1] = aaa. bom, de acordo com o algoritmo era para trocar de ordem, mas esta estourando, mesmo eu fazendo a estrutura for com contador pelo menor srting, [j+1]. Não sei se deu para entender o que eu falei, mas acho que é isso. Se alguem puder ajudar eu já fico grato.

Não faço a menor ideia do porque esta dando outofbounds.

Amigo, todo programador tem de ser um “Jack, o Estripador” e um “Dr. Frankenstein” ao mesmo tempo.

O seu lado “Jack” se manifesta quando você diz “Ok, vamos em partes”… ou seja, você pega esse problema grande e, em vez de fazer um programa com uma única função que você não está conseguindo corrigir, divide em várias funções.

O seu lado “Dr. Frankenstein” se manifesta quando você pega as partes e as costura (espero que não seja para fazer um “monstrinho” :stuck_out_tongue: )

De qualquer maneira, quebre seu problema em pelo menos 3 pedaços:
a) Um método para comparar 2 strings.
b) Um método para trocar duas posições dentro de um array.
c) O método para efetuar a ordenação em si.

Do jeito que está, é impossível saber por que é que está dando “Out of Bounds”.
É muitas partes do corpo esquartejadas para você pôr dentro da mala, aham, é muita coisa para você entender ao mesmo tempo.
Faça os três métodos, um de cada vez (aconselho começar pelo b, que é o mais fácil), corrija cada um, e junte tudo.

Estava escrevendo isto quando vi sua mensagem e vi mais problemas. Foi mal, vou explicar certinho como funciona.

A linha 7, logo no começo compara o tamanho de caracteres entre uma String e outra.

                            if (nome[j].length() <= nome[j + 1].length()) { // linha 7 

Se o String que vai ser comparado, nome[j].length(), tiver mais caracteres que nome[j+1].length(), como diz na linha 7, ele vai para linha 26 e cria um for do tamanho do String menor, no caso nome[j+1].length:

for (int k = 1; k < nome[j + 1].length(); k++) { // linha 27

Esse for vai escanear até o ultimo caracter do String [j+1], como disse anteriormente. E em seguida, na linha 29 vê se “k” da “estrutura for” for diferente do tamanho maximo da string [j+1]

 if (k != (nome[j + 1].length() - 1)) { //linha 29 do exercicio acima  

Até ai tudo funciona beleza. Porém, quando o valor de k fica igual a (nome[j+1].length()-1) ele entra na linha 49, esta:

 if (nome[j].charAt(k) >= nome[j + 1].charAt(k)) { // linha 49 

Que diz que se o caracter do nome[j], string maior, tiver a mesma letra ou maior que o ultimo caracter de nome[j+1] então ele executa as trocas, linhas 52 até 62. Porem esta dando out of bounds em alguma parte. coloquei um System.out.println(“Entrou aqui”); assim que ele passa por esta linha, ele passa uma vez, na segunda não.

Então o que acontece:
Escou usando esses valores para nome[]:
nome[0] = “aaaaa”;
nome[1] = “aaaa”;
nome[2] = “aaa”;
nome[3] = "aa;

A primeira vez funciona e ele troca: então fica:
nome[0] = “aaaa”;
nome[1] = “aaaaa”;
nome[2] = “aaa”;
nome[3] = "aa;

Na segunda vez dá outofbounds. Não faço ideia do por que.

Oi,

Está muito claro qual é o problema:

if (nome[j].charAt(k) >= nome[j + 1].charAt(k)) { // problemas aqui

Se o nome[j] tiver conteudo “aaa” e o ‘k’ tiver conteudo de 3… o que vai acontecer ? Out of bounds…

Então o correto seria:

if (nome[j].length() < k && nome[j].charAt(k) >= nome[j + 1].charAt(k)) { // problemas aqui

Viu ?

Tchauzin!

Antes de discutir se o que o seu professor ta pedindo faz sentido ou nao, leia:

http://www.refactoring.com/catalog/extractMethod.html

Pelo amor de tudo que eh mais bonito nesse mundo. Serio mesmo, leia:

http://www.refactoring.com/catalog/extractMethod.html

De verdade, eu suplico. Leia:

http://www.refactoring.com/catalog/extractMethod.html

Olá, Companheiro

Coloca o programa inteiro ai pra gente ver.
Por que eu não sei o que significa n ?

for (int i = 0; i < n.length; i++) {

Até quando esse laço executa?

Será que se eu der somente os tijolos para um pedreiro ele saberá o que eu quero construir?

Não seria mais fácil eu dar a planta da casa?

Oi,

Tudo bem… concordo plenamente que o método dele está dificil de entender e que não é o mais correto a fazer…
Porém, nós estamos nos esquecendo que ele quer fazer assim. E que estamos aqui para retirar dúvidas referente a isso que ele passou.

Eu tenho certeza de que com o que eu falei não ocorrerá o erro de “Out of Bounds”, e estou ansiosa para ver qual será o próximo “desafio”.

Tchauzin!

me ajuuuuuuuuuuuuuuuuuuuuuuuuuuuuda ae entao galera?

Nossa lina, Obrigado, vc manja muito.

Eu só troquei o sinal de < para >.

Muito obrigado mesmo, resolvido.

Esta aqui o codigo todo resolvido.

/*
 * Faça um programa para ler nome, idade e sexo de 20 pessoas
 * (guardar num vetor cada uma das informações anteriores)
 * 
 * 1- Ordenar o vetor por nome
 * 2- Ordenar o vetor por idade
 * 3- Solicitar o nome, listar a idade, nome e sexo
 * 4- Mostrar nome da pessoa mais idosa
 * 5- Mostrar media de idade dos homens
 * 6- Total de mulheres
 */

/*
 * Autor: Felipe Maya Muniz
 */

import java.awt.event.KeyEvent;
import java.text.Collator;
import java.util.Arrays;
import javax.swing.JOptionPane;

public class Exercicio04 {

	static final int MAX = 4;

	public static void main(String args[]) {

		int n[] = new int[MAX];
		String nome[] = new String[MAX];
		char sexo[] = new char[MAX];
		int idade[] = new int[MAX];

		char op;
		String saida = "", nomeMaisVelho = "", saux = "";
		int maisVelho = 0, totalIdade = 0, contaHomem = 0, contaMulher = 0, mediaHomem, primeiro, segundo;

		for (int i = 0; i < n.length; i++) {

			nome[i] = JOptionPane.showInputDialog("Nome");
			idade[i] = Integer.parseInt(JOptionPane.showInputDialog("Idade"));
			sexo[i] = JOptionPane.showInputDialog("Sexo M/F").charAt(0);

			if (idade[i] > maisVelho) {
				maisVelho = idade[i];
				nomeMaisVelho = nome[i];
			}

			if (sexo[i] == 'm' || sexo[i] == 'M') {
				totalIdade += idade[i];
				contaHomem++;
			} else {
				contaMulher++;
			}
		}

		op = 's';
		while ((op == 'S') || (op == 's')) {
			int questao = Integer.parseInt(JOptionPane
					.showInputDialog("Ordenar por nome: 1"
							+ " \nOrdenar por idade: 2"
							+ "\nFazer busca por nome: 3"
							+ " \nNome do mais idoso: 4 "
							+ "\nMedia da idade dos homens: 5"
							+ "\nTotal de mulheres: 6"));

			if (questao == 1) {

				String nomeAux;
				int idadeAux;
				char sexoAux;

				for (int i = 0; i < nome.length; i++) {

					for (int j = 0; j < nome.length - i - 1; j++) {

						if (nome[j].charAt(0) == nome[j + 1].charAt(0)) {

							if (nome[j].length() <= nome[j + 1].length()) {

								for (int k = 1; k < nome[j].length(); k++) {

									if (nome[j].charAt(k) > nome[j + 1].charAt(k)) {
										nomeAux = nome[j + 1];
										nome[j + 1] = nome[j];
										nome[j] = nomeAux;

										idadeAux = idade[j + 1];
										idade[j + 1] = idade[j];
										idade[j] = idadeAux;

										sexoAux = sexo[j + 1];
										sexo[j + 1] = sexo[j];
										sexo[j] = sexoAux;

									}
								}
							} else {
								for (int k = 1; k < nome[j + 1].length(); k++) {
									
									if (k != (nome[j + 1].length()-1)) {
									
										if ((nome[j].length()) > (k) && nome[j].charAt(k) > nome[j + 1]
												.charAt(k)) { 

											nomeAux = nome[j + 1];
											nome[j + 1] = nome[j];
											nome[j] = nomeAux;

											idadeAux = idade[j + 1];
											idade[j + 1] = idade[j];
											idade[j] = idadeAux;

											sexoAux = sexo[j + 1];
											sexo[j + 1] = sexo[j];
											sexo[j] = sexoAux;

										}
									} else {
										
										System.out.println(nome[j]);
										if ((nome[j].length()) > (k) && nome[j].charAt(k) >= nome[j + 1].charAt(k)) { // problemas aqui
											
											System.out.println("Entrou aqui");
											//System.out.println(nome[j].charAt(k) +">=" +nome[j + 1].charAt(k));
											
											nomeAux = nome[j + 1];
											nome[j + 1] = nome[j];
											nome[j] = nomeAux;

											idadeAux = idade[j + 1];
											idade[j + 1] = idade[j];
											idade[j] = idadeAux;

											sexoAux = sexo[j + 1];
											sexo[j + 1] = sexo[j];
											sexo[j] = sexoAux;
											System.out.println(nome[j]);
										}
									}

								}
							}

						} else if (nome[j].charAt(0) > nome[j + 1].charAt(0)) {

							nomeAux = nome[j + 1];
							nome[j + 1] = nome[j];
							nome[j] = nomeAux;

							idadeAux = idade[j + 1];
							idade[j + 1] = idade[j];
							idade[j] = idadeAux;

							sexoAux = sexo[j + 1];
							sexo[j + 1] = sexo[j];
							sexo[j] = sexoAux;
						}
					}
				}
				for (int i = 0; i < nome.length; i++) {
					saida += "Nome: " + nome[i] + " " + idade[i]
							+ " anos sexo: " + sexo[i] + "\n";
				}
				JOptionPane.showMessageDialog(null, saida);

			} else if (questao == 2) {

			} else if (questao == 3) {

				String busca = JOptionPane
						.showInputDialog("Digite nome da busca");
				int numeroachado = 0;
				for (int i = 0; i < nome.length; i++) {
					if (nome[i].equals(busca))
						numeroachado = i;
				}
				if (numeroachado > 0) {
					JOptionPane.showMessageDialog(null, "Resultado: \nNome: "
							+ nome[numeroachado] + " Idade: "
							+ idade[numeroachado] + " Sexo: "
							+ sexo[numeroachado]);
				} else {
					JOptionPane.showMessageDialog(null, "Não foi encontrado");
				}
			} else if (questao == 4) {

				JOptionPane.showMessageDialog(null, nomeMaisVelho);
			} else if (questao == 5) {
				if (contaHomem >= 1) {
					mediaHomem = totalIdade / contaHomem;
					JOptionPane.showMessageDialog(null, mediaHomem);
				} else {
					JOptionPane
							.showMessageDialog(null, "Nenhum homem na lista");
				}
			} else if (questao == 6) {
				JOptionPane.showMessageDialog(null, contaMulher);
			} else {
				continue;
			}

			saida = "";
			saux = JOptionPane.showInputDialog("Deseja continuar? (s/n)");
			op = saux.charAt(0);
		}

	}
}

Mais uma vez obrigado. Agora só tenho que resolver a questão 2, ordenar por idade, mas isso depois do trabalho e é mais facil. Obrigado pela ajuda.