Logica com Combinação

Como eu faço para combinar elementos? Por exemplo, eu tenho 6 pessoas (joão, maria, jose, carlos, bruno, lucia) e 3 bancos duplos, e eu quero saber todas as combinações possives que podem ser feita:
joão ao lado de maria,
joão ao lado se jose,
joão ao lado de carlos e assim sucessivamente
Alguém sabe como eu crio esse laço?

seria isso?

public class CombinacoesPosiveis { public static void main(String[] args){ String[] pessoas = new String[]{"João","Maria","José","Carlos","Bruno","Lucia"}; for(int i=0; i<pessoas.length; i++){ for(int j=i+1; j<pessoas.length; j++){ System.out.println(pessoas[i]+" ao lado de "+pessoas[j]); } } } }

ops entreguei mastigadinho não deveria ter feito isso

mas a logica é a seguinte tu pega a primeira pessoa e coloca do lado todas as outras
pega a segunda e coloca ao lado todas as outras mas não coloca com a primeira porque ela já sentou ao lado antes
pega a terceira e coloca ao lado todas as outras mas não coloca com a primeira e nem com a segunda pelo mesmo motivo acima
e assim por diante…

até

Então eu fiz mais ou menos isso, mas com uma lista:
Eu tenho uma lista de Materias, por exemplo: Matematica na turma k, Matematica na turma J, Geografia na turma K, Geografia na turma J, Ciencias na turma K, ciencias na Turma J e assim sucessivamente…
eu quero saber quais são as combinações possiveis entre as matrias… por exemplo, Matematica K, Geografia k, Ciencias K…
Depois Matematica K, Geografia j, Ciencias K…
e assim sucessivamente…
Criei esse código, mas tá dando erro:

Iterator iterator =listMateria.iterator(); // onde listMateria é a lista com todas as materias com todas as turmas
        for(int i = 0; i<listMateria.size(); i++){
            Materia aux = (Materia) iterator.next();
            for(int k =0; k<listMateria.size();i++){
                Materia aux2 = (Materia) iterator.next();
                if(!(aux.getNome().equals(aux2.getNome()))){
                  System.out.println(aux.getNome()+ " "+ aux.getTurma()+ " "+ aux2.getNome()+" "+aux2.getTurma());
                }//end if
           }//end for
        }//end for

O que há e errado?

[quote=oitathi]
Criei esse código, mas tá dando erro:

Iterator iterator =listMateria.iterator(); // onde listMateria é a lista com todas as materias com todas as turmas
        for(int i = 0; i<listMateria.size(); i++){
            Materia aux = (Materia) iterator.next();
            for(int k =0; k<listMateria.size();i++){
                Materia aux2 = (Materia) iterator.next();
                if(!(aux.getNome().equals(aux2.getNome()))){
                  System.out.println(aux.getNome()+ " "+ aux.getTurma()+ " "+ aux2.getNome()+" "+aux2.getTurma());
                }//end if
           }//end for
        }//end for

O que há e errado?[/quote]
Qual erro ele tá dando?

ele não volta pro primeiro laço do for… ele termina o ultimo, mas o meu i não é incrementado

Pronto! Vc colocou o ‘i’ no for onde vc usa o ‘k’. Testa ai.

Iterator iterator =listMateria.iterator(); // onde listMateria é a lista com todas as materias com todas as turmas for(int i = 0; i<listMateria.size(); i++){ Materia aux = (Materia) iterator.next(); for(int k =0; k<listMateria.size();k++){ Materia aux2 = (Materia) iterator.next(); if(!(aux.getNome().equals(aux2.getNome()))){ System.out.println(aux.getNome()+ " "+ aux.getTurma()+ " "+ aux2.getNome()+" "+aux2.getTurma()); }//end if }//end for }

eh eu tinha visto isso… mas o erro continua…

Tenta colocar no for aninhado int k = i+1 ...

desculpa drigo, não entendi o q vc quis dizer…

Em vez de for(int k =0; k<listMateria.size();k++){
Coloque for(int k =i+1; k<listMateria.size();k++){
Assim que tava no exemplo…

Aliás, sua List é algo do tipo List<Materia> listMateria = new ArrayList<Materia>(); //?
Porque se for, você pode evitar um cast, fazendo

Iterator<Materia> iterator =listMateria.iterator();

O que tem nesse objeto Materia? cada materia tem sua turma?

Mas se ele colocar assim não vai imprimir a lista toda…

Eu mudei o codigo e funcionou…

for (Iterator<Materia> it = listMateria.iterator(); it.hasNext();) {
             Materia aux = (Materia) it.next();
           for (Iterator<Materia> it2 = listMateria.iterator(); it2.hasNext();) {
                    Materia aux2 = (Materia) it2.next();
                    if(!(aux.getNome().equals(aux2.getNome()))){
                    System.out.println(aux.getNome()+ " "+ aux.getTurma()+ " "+ aux2.getNome()+" "+aux2.getTurma());
                    }//end if
           }//end for
        }//end for

O meu problema agora eh o seguinte, se eu quiser fazer combinações de tres em tres materia por exemplo, eu vou ter q usar 3 laços de for… o problema é o seguinte, eu não sei quantas materias vai ter na minha lista, podem ser duas (tendo assim combinações de duas materias), podem ter tres ( combinações de três materias) e assim sucessivamente… como posso colocar um for geral para todas as combinações?
Obrigada

Ha um tempo atras pensei em fazer algo assim mas como eu sabia que o numero era sempre o mesmo deixei de lado e fis com loop encadeados
mas hoje tomei vergonha e passei 3 horas montando esse exemplo :smiley:
mas valeu a pena!! conhecimento nunca é demais!

ta abaixo o código do exemplo ta uma confusão (legibilidade ZERO) que acho que nem eu entendo mais

mas tenta entender e adaptar ao teu caso

[code]import java.util.ArrayList;
import java.util.List;

public class CombinacoesPosiveis2 {

public static void main(String[] args){
	String[][] vetString= combina(new String[]{"A", "B", "C", "D", "E"},
			new String[]{"Matemática", "Geografia", "Ciência","Historia"});
	for(String str : mistura(vetString)){
		System.out.println(str);
	}
}

public static String[][] combina(String[] turmas, String[] materias){  // esse metodo pode 
	String[][] matXturma = new String[materias.length][turmas.length]; // ser removido e
	int cont = 0;                                                      // as açoes feita nele 
	for(int i=0; i<materias.length; i++){                              // ficarem no
		for(int j=0; j<turmas.length; j++){                            // metodo a baixo
			matXturma[i][j] = (materias[i] + " turma " + turmas[j]);   
			cont++;                                                    
		}
	}
	return matXturma;
}

public static List<String> mistura(String[][] matXturma){
	List<String> listTmp1 = new ArrayList<String>();
	List<String> listTmp2 = new ArrayList<String>();
	for(int i=0; i<matXturma[0].length; i++){                     // acho que
		for(int j=0; j<matXturma[0].length; j++){                 // com algumas modificaçoes
			listTmp1.add(matXturma[0][i]+" , "+matXturma[1][j]);  // essa parte do codigo
		}                                                         // pode ser retirada
	}                                                             // 
	for(int i=2; i<matXturma.length; i++){
		listTmp2.clear();
		for(int j=0; j<matXturma[0].length; j++){
			for(String str : listTmp1){
				listTmp2.add(str+" , "+matXturma[i][j]);
			}
		}
		listTmp1.clear();
		for(String str : listTmp2){
			listTmp1.add(str);
		}
	}
	return listTmp1;
}

}

[/code]

até!