Java

Zagnieżdżone pętle for

  • 2016-03-26 22:33
  • 0 komentarzy
  • 2622 odsłony
  • Oceń ten tekst jako pierwszy
Artykuł dotyczy takiej sytuacji:
for(int i=a1;i<=b1;i++)
   for(int j=a2;j<=b2;j++)
      ...
      {
           //zrób coś, kod zależy od wartości zmiennych sterujących i,j,...,
      }
   }
}

Niestety, w czasie pisania programu nie znamy głębokości zagnieżdżenia, nie znamy też zakresów zmiennych sterujących: zmienne a1,b1,a2,...
Mój pomysł jest następujący, korzystamy z dwóch kolekcji:
  • ArrayList<Point> ranges. Rozmiar tej kolekcji to głębokość zagnieżdżenia, każdy element tej kolekcji (obiekt klasy Point to para liczb typu int) wyznacza zakres pętli.
  • ArrayList<Integer> indexes. Kolekcja ta zawiera wartości zmiennych sterujących.
Do zorganizowania pętli wykorzystujemy tę metodę:
private void doSomething(ArrayList<Point> ranges, ArrayList<Integer> indexes)
{
    if(ranges.size() == 1)
    {
        Task task = new Task(); //nazwa tej klasy jest całkowicie dowolna
        for(int i=ranges.get(0).x;i<=ranges.get(0).y;i++)
        {
             ArrayList<Integer> indexes2 = new ArrayList<Integer>(indexes);
             indexes2.add(i);
             task.run(indexes2); //nazwa tej metody również jest dowolna
        }
    }
    else
    {
        for(int i=ranges.get(0).x;i<=ranges.get(0).y;i++)
        {
            ArrayList<Point> ranges2 = new ArrayList<Point>();
            ranges2.addAll(ranges);
            ranges2.remove(0);                
            ArrayList<Integer> indexes2 = new ArrayList<Integer>(indexes);
            indexes2.add(i);
            doSomething(ranges2,indexes2);
        }
    }       
}

Najpierw tworzymy kolekcję ranges. Możemy odpytać użytkownika, możemy losować,...
Potem wywołujemy
doSomething(ranges, new ArrayList<Integer>());

Jeżeli kod klasy Task wygląda tak:
class Task
{
     private void run(ArrayList<Integer> indexes)
     {
         int sum = 0;
         String txt = "";
         int sumOfIndexes = 0;
         for(int l:indexes)
         {
             sum+=l*l;
             txt+=l+"^2+";
             sumOfIndexes+=l;
         }
         txt = txt.substring(0,txt.length()-1);
         if(sum == 100 && (sumOfIndexes % 2) == 0)
         {
             System.out.println(txt+"="+sum);
         }          
    }
}
to wypisane zostaną wyrażenia postaci 6^2+8^2=100,5^2+5^2+5^2+4^2+3^2=100,...,(suma zmiennych sterujących musi być parzysta, suma ich kwadratów musi być równa 100).