1. 程式人生 > >巢狀的用法與for的區別

巢狀的用法與for的區別

 

上週在工作中遇到了頁面迭代的情況,初來乍到只知道簡單的迭代用法,但是我要處理的情況是一個List A 需要每18條資料去一個迭代成行 每六條資料在每行中迭代出三列 再把每條資料放在這三列中形成六個點。聽上去有些亂啊!確實挺頭疼的,呵呵

這樣可能看的就清晰些了。

先簡單說一下<c:forEach></c:forEach>的用法吧

<c:forEach>標籤的語法定義如下所示。

                  <c:forEachvar="name" items="expression" varStatus="name"

                           begin="expression"

end="expression" step="expression">

                           body content

                  </c:forEach>

         <c:forEach>標籤具有以下一些屬性:

         var:迭代引數的名稱。在迭代體中可以使用的變數的名稱,用來表示每一個迭代變數。型別為String。

         items:要進行迭代的集合。對於它所支援的型別將在下面進行講解。

           varStatus:迭代變數的名稱,用來表示迭代的狀態,可以訪問到迭代自身的資訊。


           begin:如果指定了items,那麼迭代就從items[begin]開始進行迭代;如果沒有指定items,那麼就從begin開始迭代。它的型別為整數。

end:如果指定了items,那麼就在items[end]結束迭代;如果沒有指定items,那麼就在end結束迭代。它的型別也為整數。

             step:迭代的步長。

         <c:forEach>標籤的items屬性支援Java平臺所提供的所有標準集合型別。此外,您可以使用該操作來迭代陣列(包括基本型別陣列)中的元素。它所支援的集合型別以及迭代的元素如下所示:

          java.util.Collection:呼叫iterator()來獲得的元素。


          java.util.Map:通過java.util.Map.Entry所獲得的例項。

          java.util.Iterator:迭代器元素。

          java.util.Enumeration:列舉元素。

          Object例項陣列:陣列元素。

          基本型別值陣列:經過包裝的陣列元素。

          用逗號定界的String:分割後的子字串。

          javax.servlet.jsp.jstl.sql.Result:SQL查詢所獲得的行。

         不論是對整數還是對集合進行迭代,<c:forEach>的varStatus屬性所起的作用相同。和var屬性一樣,varStatus用於建立限定了作用域的變數(改變數只在當前標籤體內起作用)。不過,由varStatus屬性命名的變數並不儲存當前索引值或當前元素,而是賦予javax.servlet.jsp.jstl.core.LoopTagStatus類的例項。該類包含了一系列的特性,它們描述了迭代的當前狀態,如下這些屬性的含義如下所示:

         current:當前這次迭代的(集合中的)項。

         index:當前這次迭代從0開始的迭代索引。

          count:當前這次迭代從1開始的迭代計數。

          first:用來表明當前這輪迭代是否為第一次迭代,該屬性為boolean型別。

          last:用來表明當前這輪迭代是否為最後一次迭代,該屬性為boolean型別。

          begin:begin屬性的值。

endend屬性的值

          step:step屬性的值

下面就來看兩個基本的例子,第一個例子是依次輸出集合內的元素。

<c:forEachvar="item" items="${contents}" varStatus="status">

         $status.count:${item}

</c:forEach>

下面的例子是一個固定次數的迭代,用來輸出1到9的平方。

<c:forEachvar="x" begin="1"end="9" step="1">

         ${x*x}

</c:forEach>

好了,現在說說我的問題

很顯然我遇到的問題,需要巢狀迭代。說實話,如果是用for去實現這個,在我看來還是很簡單的。但是在jsp中植入指令碼語言不是很正規(主要是領導不讓),所以只好迭代。

與forEach與for的區別最主要是沒有i++這個操作,所以用起來不太一樣。forEach提供了index屬性可以幫我們解決這個問題。當使用for時,最裡層的for迴圈中獲取的時間複雜度也就是迴圈次數為每層for迴圈的次數相乘 而在forEach中,我們只能利用index屬性在最裡層進行認為計算。在每層也要規定它的迴圈次數,才能最終獲得指定的資料。似乎我的表達能力有限,可能說的不是很明白。不過沒關係,有程式碼有真相~~~

 1                               <c:forEach var="data"items="${statusSource}" begin="1" step="18" varStatus="st1" >
 2 <tr class="multicolor1" >
 3                                         <c:forEach var="td"  begin="1" end="6" varStatus="st2">
 4                                              <td  style="TEXT-ALIGN: center;">
 5                                                  <c:forEach begin="1" end="3" var="subcol" varStatus="st3">
 6 
 7                                           ${statusSource[(st1.index-1)+(st2.index-1)*6+(st3.index)-1]}
 8                                                      
 9                                                  </c:forEach>
10                                              </td>
11                                         </c:forEach>
12                                     </tr>
13                                     </c:forEach>

學習了~~