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
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é!