Ciao a tutti e grazie per le risposte.
Come suggeritomi sto rinfrescando le mie conoscenze ma nel frattempo per risolvere il mio problema ho elaborato una soluzione sporca che volevo condividere.
Ho aggiunto un metodo ottimizzato oltre a quello che avevo usato.
Di seguito il codice completo della classe:
mport java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class Combinazioni {
private int[] p1={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
private int[] p2={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
private int[] p3={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
private int[] p4={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
private int[] p5={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
private int[] p6={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
private int[] p7={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
private int[] p8={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
// private int[] p1={15,14,13,12,11,10,9,8,7,6,5,4,3,2,1};
// private int[] p2={15,14,13,12,11,10,9,8,7,6,5,4,3,2,1};
// private int[] p3={15,14,13,12,11,10,9,8,7,6,5,4,3,2,1};
// private int[] p4={15,14,13,12,11,10,9,8,7,6,5,4,3,2,1};
// private int[] p5={15,14,13,12,11,10,9,8,7,6,5,4,3,2,1};
// private int[] p6={15,14,13,12,11,10,9,8,7,6,5,4,3,2,1};
// private int[] p7={15,14,13,12,11,10,9,8,7,6,5,4,3,2,1};
// private int[] p8={15,14,13,12,11,10,9,8,7,6,5,4,3,2,1};
public void calcola()
{
long prodotto=0;
for(int a=0;a<15;a++)
for(int b=0;b<15;b++)
for(int c=0;c<15;c++)
for(int d=0;d<15;d++)
for(int e=0;e<15;e++)
for(int f=0;f<15;f++)
for(int g=0;g<15;g++)
for(int h=0;h<15;h++)
{
if(p1[a]+p2
+p3[c]+p4[d]+p5[e]+p6[f]+p7[g]+p8[h]<10){
System.out.println(p1[a]+" "+p2+" "+p3[c]+" "+p4[d]+" "+p5[e]+ " "+p6[f]+" "+p7[g]+" "+p8[h]);
prodotto++;
}
}
System.out.println(prodotto+ " combinazioni trovate!");
return;
}
public void calcolaOttimizzato(){
long iterazioni=0;
//Dichiarazione strutture dati
Map<Integer,Map<Integer,Map<Integer,Map<Integer,Map<Integer,Map<Integer,Map<Integer,Map<Integer,List<Integer>>>>>>>>> livello1=new LinkedHashMap<Integer,Map<Integer,Map<Integer,Map<Integer,Map<Integer,Map<Integer,Map<Integer,Map<Integer,List<Integer>>>>>>>>> ();
Map<Integer,Map<Integer,Map<Integer,Map<Integer,Map<Integer,Map<Integer,Map<Integer,List<Integer>>>>>>>> livello2=new LinkedHashMap<Integer,Map<Integer,Map<Integer,Map<Integer,Map<Integer,Map<Integer,Map<Integer,List<Integer>>>>>>>> ();
Map<Integer,Map<Integer,Map<Integer,Map<Integer,Map<Integer,Map<Integer,List<Integer>>>>>>> livello3=new LinkedHashMap<Integer,Map<Integer,Map<Integer,Map<Integer,Map<Integer,Map<Integer,List<Integer>>>>>>> ();
Map<Integer,Map<Integer,Map<Integer,Map<Integer,Map<Integer,List<Integer>>>>>> livello4=new LinkedHashMap<Integer,Map<Integer,Map<Integer,Map<Integer,Map<Integer,List<Integer>>>>>> ();
Map<Integer,Map<Integer,Map<Integer,Map<Integer,List<Integer>>>>> livello5=new LinkedHashMap<Integer,Map<Integer,Map<Integer,Map<Integer,List<Integer>>>>> ();
Map<Integer,Map<Integer,Map<Integer,List<Integer>>>> livello6=new LinkedHashMap<Integer,Map<Integer,Map<Integer,List<Integer>>>> ();
Map<Integer,Map<Integer,List<Integer>>> livello7=new LinkedHashMap<Integer,Map<Integer,List<Integer>>> ();
Map<Integer,List<Integer>> livello8=new LinkedHashMap<Integer,List<Integer>> ();
Map<Integer,Map<Integer,Map<Integer,List<Integer>>>> livello1Temp=new LinkedHashMap<Integer,Map<Integer,Map<Integer,List<Integer>>>> ();
Map<Integer,Map<Integer,List<Integer>>> livello2Temp=new LinkedHashMap<Integer,Map<Integer,List<Integer>>> ();
Map<Integer,List<Integer>> livello3Temp=new LinkedHashMap<Integer,List<Integer>> ();
//Dichiarazione contenitori temporanei
List<Integer> valoriLivello8=new ArrayList<Integer>();
long fisso=1;
//Inizio popolamento struttura dati
for(int a=0;a<p1.length;a++){
iterazioni++;
if(p1[a]<10){
livello1.put(p1[a],livello2);
if(!livello2.isEmpty()){
livello2=new LinkedHashMap<Integer,Map<Integer,Map<Integer,Map<Integer,Map<Integer,Map<Integer,Map<Integer,List<Integer>>>>>>>> ();
livello1.put(p1[a],livello2);
}
for(int b=0;b<p2.length;b++){
iterazioni++;
if(p1[a]+p2<10){
livello2.put(p2,livello3);
livello3=new LinkedHashMap<Integer,Map<Integer,Map<Integer,Map<Integer,Map<Integer,Map<Integer,List<Integer>>>>>>> ();
livello2.put(p2,livello3);
for(int c=0;c<p3.length;c++){
iterazioni++;
if(p1[a]+p2+p3[c]<10){
livello3.put(p3[c],livello4);
livello4=new LinkedHashMap<Integer,Map<Integer,Map<Integer,Map<Integer,Map<Integer,List<Integer>>>>>> ();
livello3.put(p3[c],livello4);
for(int d=0;d<p4.length;d++){
iterazioni++;
if(p1[a]+p2+p3[c]+p4[d]<10){
livello4.put(p4[d],livello5);
livello5=new LinkedHashMap<Integer,Map<Integer,Map<Integer,Map<Integer,List<Integer>>>>>();
livello4.put(p4[d],livello5);
for(int e=0;e<p5.length;e++){
iterazioni++;
if(p1[a]+p2+p3[c]+p4[d]+p5[e]<10){
livello5.put(p5[e],livello6);
livello6=new LinkedHashMap<Integer,Map<Integer,Map<Integer,List<Integer>>>>();
livello5.put(p5[e],livello6);
for(int f=0;f<p6.length;f++){
iterazioni++;
if(p1[a]+p2+p3[c]+p4[d]+p5[e]+p6[f]<10){
livello6.put(p6[f],livello7);
livello7=new LinkedHashMap<Integer,Map<Integer,List<Integer>>>();
livello6.put(p6[f],livello7);
for(int g=0;g<p7.length;g++){
iterazioni++;
if(p1[a]+p2+p3[c]+p4[d]+p5[e]+p6[f]+p7[g]<10){
livello7.put(p7[g],livello8);
livello8=new LinkedHashMap<Integer,List<Integer>>();
livello7.put(p7[g],livello8);
valoriLivello8=new ArrayList<Integer>();
for(int h=0;h<p8.length;h++){
iterazioni++;
if(p1[a]+p2[b]+p3[c]+p4[d]+p5[e]+p6[f]+p7[g]+p8[h]<10){
valoriLivello8.add(p8[h]);
livello8.put(10, valoriLivello8);
System.out.println(p1[a]+" "+p2[b]+" "+p3[c]+" "+p4[d]+" "+p5[e]+ " "+p6[f]+" "+p7[g]+" "+p8[h]);
}
}
}
}
}
}
}
}
}
}
}
}
}
}}
//System.out.println(livello1);
}
System.out.println("Iterazioni="+iterazioni);
}
public static void main(String[] args){
Combinazioni combinazioni=new Combinazioni();
System.out.println("-------SOLUZIONE OTTIMIZZATA-------");
long inizio=System.currentTimeMillis();
combinazioni.calcolaOttimizzato();
long fine=System.currentTimeMillis();
System.out.println("Tempo impiegato: "+(fine-inizio)+ "ms!");
System.out.println("");
System.out.println("-------SOLUZIONE NON OTTIMIZZATA-------");
inizio=System.currentTimeMillis();
combinazioni.calcola();
fine=System.currentTimeMillis();
System.out.println("Tempo impiegato: "+(fine-inizio)+ "ms!");
}
}
E i tempi impiegati dalle due routine:
-------SOLUZIONE OTTIMIZZATA-------
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 2
1 1 1 1 1 1 2 1
1 1 1 1 1 2 1 1
1 1 1 1 2 1 1 1
1 1 1 2 1 1 1 1
1 1 2 1 1 1 1 1
1 2 1 1 1 1 1 1
2 1 1 1 1 1 1 1
Iterazioni=7530
Tempo impiegato: 16ms!
-------SOLUZIONE NON OTTIMIZZATA-------
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 2
1 1 1 1 1 1 2 1
1 1 1 1 1 2 1 1
1 1 1 1 2 1 1 1
1 1 1 2 1 1 1 1
1 1 2 1 1 1 1 1
1 2 1 1 1 1 1 1
2 1 1 1 1 1 1 1
9 combinazioni trovate!
Tempo impiegato: 20859ms!
Ovviamente sono ben accette critiche
Grazie