In a number of cases, the order of nesting of loops (and conditional tests) is not important: All must be done, but the order of nesting does not change the result.
Example: Sum the cells in a three-dimensional array.
Dim dblTotal As Double dblTotal = 0# For k = 1 To MaxK For j = 1 To MaxJ For i = 1 To MaxI dblTotal = dblTotal + arrValues(i, j, k) Next i Next j Next k ' Use "dblTotal" here......can safely be changed to...
Dim dblTotal As Double dblTotal = 0# For i = 1 To MaxI For j = 1 To MaxJ For k = 1 To MaxK dblTotal = dblTotal + arrValues(i, j, k) Next k Next j Next i ' Use "dblTotal" here...
Q: Why do this?
A1: We might want to print subtotals as our next move.
Dim dblTotal As Double Dim dblTotalI As Double Dim dblTotalJ As Double Dim dblValueK As Double dblTotal = 0# For i = 1 To MaxI dblTotalI = 0# For j = 1 To MaxJ dblTotalJ = 0# For k = 1 To MaxK dblValueK = arrValues(i, j, k) dblTotalJ = dblTotalJ + dblValueK Next k Print "Total for i=" & i & ", j=" & j & " is " & dblTotalJ dblTotalI = dblTotalI + dblTotalJ Next j Print "Total for i=" & i & " is " & dblTotalI dblTotal = dblTotal + dblTotalI Next i ' Use "dblTotal" here... Print "Final total is " & dblTotalA1b: To support other refactoring moves...
From...
If x Then If y Then Do A. Else Do B. End If Else If y Then Do A. Else Do C. End If End IfTo...
If y Then If x Then Do A. Else Do A. End If Else If x Then Do B. Else Do C. End If End Ifthen...
If y Then Do A. Else If x Then Do B. Else Do C. End If End If
Q: Why do this?
A2: It may be necessary to make the code more efficient or intuitive.
Here 's a real example, taken from production code:
For i = 1 To MaxI For j = 1 To MaxJ If Data(i) = 0 Then ' Do important processing. End If Next j Next ichanged to...
For i = 1 To MaxI If Data(i) = 0 Then For j = 1 To MaxJ ' Do important processing. Next j End If Next iBecause we don't need to determine if "Data(i)" is processable MaxJ TIMES (for each and every i)!!!
This example was the inspiration for creating this page -- and the first few generic examples. -- JeffGrigg
Q: Why do this?
A3: It can be used to increase locality of reference so as to not hammer your system cache as much. -- AlastairBridgewater
Q: Why do this?
A4: Because my brain likes things to be in order. Therefore:
for i... for j... for k...reads easier than
for j... for i... for k...
Or you might choose the J (JayLanguage) statement:
theTotal =: +/,theArraywhich works for any rank array, not just the rank 3 array being discussed. --JimRussell