Ordenação de arraylist com vetores

19 respostas
T

Olá.

Gostaria de fazer um programa em java que gere uma certa quantidade de jogos de 6 números, por exemplo. Até aí tudo bem, está tudo certo.

Inicialmente, gostaria de ordenar o vetor de cada jogo, por exemplo: [20, 17, 29, 28, 55, 60]

Daí usei o Collections.sort(VETOR) e deu certo: [17, 20, 28, 29, 55, 60].

[color=red]O problema é o seguinte: [/color]

Eu tenho uma arraylist com todos os vetores gerados, e gostaria de ordenar..

Rodei aqui e deu isso:

1º jogo -> [1, 13, 19, 26, 33, 35]
2º jogo -> [12, 25, 35, 39, 41, 59]
3º jogo -> [2, 3, 4, 20, 34, 49]
4º jogo -> [4, 7, 14, 19, 43, 45]
5º jogo -> [10, 12, 13, 20, 42, 51]
6º jogo -> [6, 22, 23, 24, 40, 55]
7º jogo -> [4, 6, 11, 47, 48, 51]
8º jogo -> [9, 26, 43, 48, 53, 59]
9º jogo -> [6, 19, 30, 32, 48, 50]
10º jogo -> [2, 12, 16, 19, 25, 29]
*****************************************
[1, 13, 19, 26, 33, 35]
[12, 25, 35, 39, 41, 59]
[2, 3, 4, 20, 34, 49]
[4, 7, 14, 19, 43, 45]
[10, 12, 13, 20, 42, 51]
[6, 22, 23, 24, 40, 55]
[4, 6, 11, 47, 48, 51]
[9, 26, 43, 48, 53, 59]
[6, 19, 30, 32, 48, 50]
[2, 12, 16, 19, 25, 29]
*****************************************

Eu quero que apareça assim:

1º jogo -> [1, 13, 19, 26, 33, 35]
2º jogo -> [12, 25, 35, 39, 41, 59]
3º jogo -> [2, 3, 4, 20, 34, 49]
4º jogo -> [4, 7, 14, 19, 43, 45]
5º jogo -> [10, 12, 13, 20, 42, 51]
6º jogo -> [6, 22, 23, 24, 40, 55]
7º jogo -> [4, 6, 11, 47, 48, 51]
8º jogo -> [9, 26, 43, 48, 53, 59]
9º jogo -> [6, 19, 30, 32, 48, 50]
10º jogo -> [2, 12, 16, 19, 25, 29]
*****************************************
[1, 13, 19, 26, 33, 35]
[2, 3, 4, 20, 34, 49]
[2, 12, 16, 19, 25, 29]
[4, 6, 11, 47, 48, 51]
[4, 7, 14, 19, 43, 45]
[6, 19, 30, 32, 48, 50]
[6, 22, 23, 24, 40, 55]
[9, 26, 43, 48, 53, 59]
[10, 12, 13, 20, 42, 51]
[12, 25, 35, 39, 41, 59]
*****************************************

Alguem sabe como fazer?

Abaixo, segue o código.
import java.util.ArrayList;  
    import java.util.Collections;  
    import java.util.Vector;  
    public class Teste {  
       public static void main(String[] args) {  
          int numJogos, valor, novoValor;  
          numJogos = 10;  
          ArrayList<Vector<Integer>> array = new ArrayList<Vector<Integer>>(numJogos);  
          for (int i = 1; i <= numJogos; i++) {   
             Vector<Integer> vetor = new Vector<Integer>(6);  
             System.out.print(i + "º jogo -> ");  
                   for (int j = 0; j < vetor.capacity(); j++) { //percorre a capacidade do vetor e adiciona numero sorteado  
                      valor = (int) (1 + Math.random() * 60);  
                      if (vetor.contains(valor)) { //Se o vetor tiver o número sorteado, entao sorteia outro.  
                         //System.out.println("Substituindo o valor " + valor + " pois ja exite!!");  
                         novoValor = (int) (1 + Math.random() * 60);  
                         vetor.add(novoValor);  
                      } else {  
                         vetor.add(valor);     
                      }  
                   }  
             Collections.sort(vetor);  
             array.add(vetor);  
             System.out.print(vetor + "\n");     
             }   
          System.out.println("*****************************************");  
          System.out.println("******* LISTA COM TODOS OS JOGOS! *******");  
          for (int l = 0; l < array.size(); l++) {  
             System.out.println(array.get(l));  
          }  
          System.out.println("*****************************************");  
          }  
            
    }

19 Respostas

Mero_Aprendiz
TreTaA:
Olá.

Gostaria de fazer um programa em java que gere uma certa quantidade de jogos de 6 números, por exemplo. Até aí tudo bem, está tudo certo.

Inicialmente, gostaria de ordenar o vetor de cada jogo, por exemplo: [20, 17, 29, 28, 55, 60]

Daí usei o Collections.sort(VETOR) e deu certo: [17, 20, 28, 29, 55, 60].

[color=red]O problema é o seguinte: [/color]

Eu tenho uma arraylist com todos os vetores gerados, e gostaria de ordenar..

Rodei aqui e deu isso:

1º jogo -> [1, 13, 19, 26, 33, 35]
2º jogo -> [12, 25, 35, 39, 41, 59]
3º jogo -> [2, 3, 4, 20, 34, 49]
4º jogo -> [4, 7, 14, 19, 43, 45]
5º jogo -> [10, 12, 13, 20, 42, 51]
6º jogo -> [6, 22, 23, 24, 40, 55]
7º jogo -> [4, 6, 11, 47, 48, 51]
8º jogo -> [9, 26, 43, 48, 53, 59]
9º jogo -> [6, 19, 30, 32, 48, 50]
10º jogo -> [2, 12, 16, 19, 25, 29]
*****************************************
[1, 13, 19, 26, 33, 35]
[12, 25, 35, 39, 41, 59]
[2, 3, 4, 20, 34, 49]
[4, 7, 14, 19, 43, 45]
[10, 12, 13, 20, 42, 51]
[6, 22, 23, 24, 40, 55]
[4, 6, 11, 47, 48, 51]
[9, 26, 43, 48, 53, 59]
[6, 19, 30, 32, 48, 50]
[2, 12, 16, 19, 25, 29]
*****************************************

Eu quero que apareça assim:

1º jogo -> [1, 13, 19, 26, 33, 35]
2º jogo -> [12, 25, 35, 39, 41, 59]
3º jogo -> [2, 3, 4, 20, 34, 49]
4º jogo -> [4, 7, 14, 19, 43, 45]
5º jogo -> [10, 12, 13, 20, 42, 51]
6º jogo -> [6, 22, 23, 24, 40, 55]
7º jogo -> [4, 6, 11, 47, 48, 51]
8º jogo -> [9, 26, 43, 48, 53, 59]
9º jogo -> [6, 19, 30, 32, 48, 50]
10º jogo -> [2, 12, 16, 19, 25, 29]
*****************************************
[1, 13, 19, 26, 33, 35]
[2, 3, 4, 20, 34, 49]
[2, 12, 16, 19, 25, 29]
[4, 6, 11, 47, 48, 51]
[4, 7, 14, 19, 43, 45]
[6, 19, 30, 32, 48, 50]
[6, 22, 23, 24, 40, 55]
[9, 26, 43, 48, 53, 59]
[10, 12, 13, 20, 42, 51]
[12, 25, 35, 39, 41, 59]
*****************************************

Alguem sabe como fazer?

Abaixo, segue o código.
import java.util.ArrayList;  
    import java.util.Collections;  
    import java.util.Vector;  
    public class Teste {  
       public static void main(String[] args) {  
          int numJogos, valor, novoValor;  
          numJogos = 10;  
          ArrayList<Vector<Integer>> array = new ArrayList<Vector<Integer>>(numJogos);  
          for (int i = 1; i <= numJogos; i++) {   
             Vector<Integer> vetor = new Vector<Integer>(6);  
             System.out.print(i + "º jogo -> ");  
                   for (int j = 0; j < vetor.capacity(); j++) { //percorre a capacidade do vetor e adiciona numero sorteado  
                      valor = (int) (1 + Math.random() * 60);  
                      if (vetor.contains(valor)) { //Se o vetor tiver o número sorteado, entao sorteia outro.  
                         //System.out.println("Substituindo o valor " + valor + " pois ja exite!!");  
                         novoValor = (int) (1 + Math.random() * 60);  
                         vetor.add(novoValor);  
                      } else {  
                         vetor.add(valor);     
                      }  
                   }  
             Collections.sort(vetor);  
             array.add(vetor);  
             System.out.print(vetor + "\n");     
             }   
          System.out.println("*****************************************");  
          System.out.println("******* LISTA COM TODOS OS JOGOS! *******");  
          for (int l = 0; l < array.size(); l++) {  
             System.out.println(array.get(l));  
          }  
          System.out.println("*****************************************");  
          }  
            
    }

Bem, e se você criar uma classe que implemente Comparator (http://download.oracle.com/javase/1.4.2/docs/api/java/util/Comparator.html)?
Isso certamente vai te ajudar.

[]'s

T

@Mero_Aprendiz,

Desde já obrigado pela resposta.
Então no caso eu faria um método Comparator passando como parâmetro as posições X e X+1 da arraylist, é isso?

nel

TreTaA:
@Mero_Aprendiz,

Desde já obrigado pela resposta.
Então no caso eu faria um método Comparator passando como parâmetro as posições X e X+1 da arraylist, é isso?

Primeiro, não utilize Vector, faça algo do tipo:

List<List<Integer>> array = new ArrayList<List<Integer>>();

Outro detalhe, é um List de inteiros, não precisa criar uma classe que implementa o comparator.
Por padrão, ele fará isso para você, basta dar um Collections.sort() na lista que deseja ordenar.

Abraços.

T

@nel:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Teste2 {
	public static void main(String[] args) {
		int numJogos, valor, novoValor;
		numJogos = 10;
	    List<List<Integer>> lista = new ArrayList<List<Integer>>(numJogos);
		for (int i = 1; i <= numJogos; i++) { 
			//Vector<Integer> vetor = new Vector<Integer>(6);
			List<Integer> vetor = new ArrayList<Integer>(6);
			System.out.print(i + "º jogo -> ");
					for (int j = 0; j < 6; j++) { //percorre a capacidade do vetor e adiciona numero sorteado
						valor = (int) (1 + Math.random() * 60);
						if (vetor.contains(valor)) { //Se o vetor tiver o número sorteado, entao sorteia outro.
							//System.out.println("Substituindo o valor " + valor + " pois ja exite!!");
							novoValor = (int) (1 + Math.random() * 60);
							vetor.add(novoValor);
						} else {
							vetor.add(valor);	
						}
					}
			Collections.sort(vetor);
			lista.add(vetor);
			System.out.print(vetor + "\n");	
			} 
		System.out.println("*****************************************");
		System.out.println("******* LISTA COM TODOS OS JOGOS! *******");
		Collections.sort(lista);
		System.out.println(lista);
		System.out.println("*****************************************");
		}
		
}

Vc diz assim?
Se eu dou Collections.sort(lista) não dá certo…dá erro de compilação.

Desculpem, nunca trabalhei com o Comparator() :confused:

danieldomingues86

Olá,

Segue como fica :
package com.others;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public final class GeradorJogos {

	private List<Jogo> listaJogos;

	public static void main(String[] args) {
		GeradorJogos main = new GeradorJogos();
		main.criarJogos(10);
		main.imprimeJogosGerados();
	}

	public void criarJogos(int numJogosParaCriar) {

		listaJogos = new ArrayList<Jogo>(numJogosParaCriar);

		for (int i = 1; i <= numJogosParaCriar; i++) {
			Jogo jogo = new Jogo();
			
			// percorre a capacidade do vetor e adiciona numero sorteado
			for (int j = 0; j < Jogo.MAX_CAPACITY ; j++) {
				int valor = (int) (1 + Math.random() * 60);

				// Se o vetor tiver o número sorteado, entao sorteia outro.
				if (jogo.getListaNumeros().contains(valor)) {
					int novoValor = (int) (1 + Math.random() * 60);
					jogo.getListaNumeros().add(novoValor);
				} else {
					jogo.getListaNumeros().add(valor);
				}
			}
			Collections.sort(jogo.getListaNumeros());
			listaJogos.add(jogo);
		}
		
		// ordena todos os jogos gerados
		Collections.sort(listaJogos, new Jogo());
	}

	public void imprimeJogosGerados() {
		System.out.println("******* LISTA COM TODOS OS JOGOS! *******");
		if (listaJogos != null) {
			for (int l = 0; l < listaJogos.size(); l++) {
				System.out.print(l + 1 + "º jogo -> ");
				System.out.println(listaJogos.get(l).getListaNumeros());
			}
		}
		System.out.println("*****************************************");
	}
}
Jogo
package com.others;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

public final class Jogo implements Comparator<Jogo> {

	public static final int MAX_CAPACITY = 6;
	
	private final List<Integer> listaNumeros = new ArrayList<Integer>(6);
	
	@Override
	public int compare(Jogo jogo1, Jogo jogo2) {
		if(jogo1.getListaNumeros().get(0) > jogo2.getListaNumeros().get(0)){
			return 1;
		}else if(jogo1.getListaNumeros().get(0) < jogo2.getListaNumeros().get(0)){
			return -1;
		}
		return 0;
	}

	public List<Integer> getListaNumeros() {
		return listaNumeros;
	}
}

Qualquer dúvida é so falar :)

Abraços
Daniel.

T

Muito obrigado, Daniel!!

Agora só por curiosidade…tem alguma maneira de percorrer toda a lista e “pegar” os 2 números, por exemplo, que mais aparecem??

nel

TreTaA:
Muito obrigado, Daniel!!

Agora só por curiosidade…tem alguma maneira de percorrer toda a lista e “pegar” os 2 números, por exemplo, que mais aparecem??

Claro que sim!
É só usar sua lógica de progamação que eu tenho certeza que você consegue :smiley:

Abraços!

snowblacksoul

Olá Amigos, estava lendo o post e gostei muito, só pra deixar mas interessante o código, como ficaria o código se o programe pede-se os 6 numeros e com esses numeros ele me gera os 10 jogo

danieldomingues86

Oi, Não entendi o que voce quis dizer, se voce passa os 6 numeros já tem um jogo certo? o que voce quer dizer por gerar 10 jogos… iguais?
Por favor, explique um pouco melhor.

Abraços
Daniel

snowblacksoul

Daniel seguinte!!

utilizando o Scanner eu digitaria os 6 numeros, tipo (01,03,02,05,07,09) e através desses numeros digitados ele faria os 10 jogo pra mim!?
entendeu

danieldomingues86

Não…

Ok, pegando esses numeros que voce digitou, me dê exemplos dos 10 jogos que ele poderia formar pra voce por favor.

Abraços
Daniel.

snowblacksoul

Então com base nesses números que digitei ele me traria um sequência de jogos.

Abraços
Daniel!

danieldomingues86

Hum… acho que entendi agora

voce quer um padrao em cima desses numeros eh isso?
Um exemplo simples :
Numeros passados : (01,02,03,04,05,06)
2 jogo : 08,09,10,11,12,13

Mas se fosse : 1,5,10,15,20,25 ele poderia gerar 15,20,25,30,35,40…

Abraços
Daniel

snowblacksoul

HUmmmm não seria um padrão!!

tipo assim, digitei 01,03,07,21,45,60,23

ele poderia fazer um jogo com 10,30,12,54,06,32,17.

O próprio sistema aleatóriamente ao numero que passei escolheria outros jogos com base na numeração que coloquei!
mas acho que isso nao é possível, pois ai estaria usando inteligência artificial acho !!!

danieldomingues86

Ah com certeza… rsrsrs

Se voce não define alguma base pra geração, seja por aleatoriedade de forma avulsa como foi feito ou por um padrão, só se houver IA baseando-se em jogos anteriores já feitos.

Abraços
Daniel.

T

Galera…muito obrigado pela ajuda!! De verdade!

Agora me deparei com outro problema…
Eu quero gerar um arquivo .txt com a lista de jogos…daí fiz o seguinte:

public void carregaLista() {
    	File arquivo;
        try {
        	arquivo = new File("teste.txt");
        	if(arquivo.exists()) {
        		ObjectInputStream o = new ObjectInputStream(new FileInputStream(arquivo));
        		listaJogos = (List<Jogo>)o.readObject();
        		o.close();
        	}
		} catch (Exception e) {
			e.printStackTrace();
		}
    }
    
    public void gravaLista(){		
		try {
			File arquivo = new File("teste.txt");
			ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream(arquivo));
			for (int p = 0; p < listaJogos.size(); p++) {
				o.writeObject(listaJogos.get(p).getListaNumeros());
			}
			o.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

Daí gero os jogos normalmente e chamo os dois métodos…o arquivo é gerado, mas fica cheio de carecteres especiais e praticamente impossivel de ler…acho que tem algo relacionado à codificação dele…alguém sabe como resolver isso?

danieldomingues86

Olá,

Faça um teste, utilize o FileOutputStream em vez do ObjectOutputStream, assim voce consegue definir o unicode.

Exemplo:
static void writeOutput(String str) {

    try {
	FileOutputStream fos = new FileOutputStream("teste.txt");
	Writer out = new OutputStreamWriter(fos, "UTF8");
	out.write(str);
	out.close();
    } catch (IOException e) {
	e.printStackTrace();
    }
}
Abraços Daniel
T

Perfeito, Daniel!

Mais uma vez, obrigado!!

[color=red]EDIT:[/color]

Surgiu um problema inesperado…LÓGICA.
Como eu faria pra percorrer toda a lista de jogos e retornar os 2 números que mais apareceram, por exemplo?

T

bump? :smiley:

Criado 21 de junho de 2011
Ultima resposta 23 de jun. de 2011
Respostas 19
Participantes 5