<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # Java 集合迭代器 > 原文: [https://javabeginnerstutorial.com/core-java-tutorial/java-collection-iterators/](https://javabeginnerstutorial.com/core-java-tutorial/java-collection-iterators/) 在本文中,我們將開始一個新系列,我們將深入研究 1.8 版中可用的 Java 不同的集合解決方案。 對于具體的實現(例如`ArrayList`或`TreeSet`),我們將為您提供一些用例,這些用例將在這些用例中脫穎而出,并在某些情況下您應使用不同的用例。 當然,我們將寫關于 Java 8 引入的流利 API 的信息。 在本文中,我們將從`Iterator`接口開始,它是 Java 中所有集合導航的基礎。 ## 關于迭代器 當您要處理各種集合時,迭代器是基本概念。 顧名思義,它用于遍歷集合的元素。 此接口在 Java 的版本 **1.2** 中引入。 在此之前,您可以使用`Enumeration`接口-該接口仍然存在,但建議您使用基于`Iterator`接口的集合。 如果我們看一下接口定義,它非常苗條: ```java package java.util; import java.util.function.Consumer; public interface Iterator { boolean hasNext(); E next(); default void remove() { throw new UnsupportedOperationException("remove"); } default void forEachRemaining(Consumer<? super E> action) { Objects.requireNonNull(action); while (hasNext()) action.accept(next()); } } ``` 該接口支持 4 種操作: * `hasNext`:如果當前可迭代對象具有更多要訪問的元素,則此方法返回`true`。 * `next`:此方法返回當前可迭代對象中的下一個對象。 如果沒有更多對象,則將獲得`java.util.NoSuchElementException`。 * `remove`:此方法用于從給定的可迭代對象中刪除元素。 如您所見,這是默認方法。 這意味著,并非`Iterator`接口的每個實現都必須實現此方法。 而且,如果未實現,則會得到一個`java.lang.UnsupportedOperationException`。 * `forEachRemaining`:此方法在此可迭代過程中的每個剩余元素上調用提供的操作-或直到該操作引發異常。 如您所見,此接口具有正確數量的方法,可讓您開始進行迭代。 您唯一不能做的就是將元素添加到可迭代對象中。 但是我們可以忍受。 正如您已經在思考的那樣,唯一的限制是只能進行*正向迭代*。 在本系列的后面部分,我們將看一下`ListIterator`,它擴展了`Iterator`,是專門處理列表遍歷的專家,并添加了一些有用的方法。 ## 示例 現在是時候使用`Iterator`接口進行一些示例了。 因為我們沒有引入其他任何集合,所以我們使用由`java.util.Arrays.asList`創建的列表。 ## 迭代 這是非常基本的用例:迭代: ```java Iterator iterator = Arrays.asList("HEARTS", "SPADES", "CLUBS", "DIAMONDS").iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); } ``` 如您所料,這將導致以下結果: ```java HEARTSSPADESCLUBSDIAMONDS ``` 即使迭代很容易,也有一些陷阱: ```java Iterator suits = Arrays.asList("HEARTS", "SPADES", "CLUBS", "DIAMONDS").iterator(); Iterator ranks = Arrays.asList("2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A").iterator(); while (ranks.hasNext()) {while (suits.hasNext()) {System.out.println(suits.next() + " " + ranks.next());}} ``` 結果是: ```java HEARTS 2SPADES 3CLUBS 4DIAMONDS 5 ``` 這有一個小錯誤,但是如果我們切換迭代器的執行順序,則會出現錯誤: ```java Iterator suits = Arrays.asList("HEARTS", "SPADES", "CLUBS", "DIAMONDS").iterator(); Iterator ranks = Arrays.asList("2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A").iterator(); while (suits.hasNext()) {while (ranks.hasNext()) {System.out.println(suits.next() + " " + ranks.next());}} ``` 結果是 ```java HEARTS 2SPADES 3CLUBS 4DIAMONDS 5Exception in thread "main" java.util.NoSuchElementException at java.util.AbstractList$Itr.next(AbstractList.java:364) ``` 這不是您想要的。 ## 在循環后使用迭代器 開發人員在開始時遇到的一個常見問題是,他們在循環之后訪問迭代器: ```java Iterator iterator = Arrays.asList(1, 4, 223, 56, 23, 88, 346, 78, 45, 33).iterator(); while (iterator.hasNext()) {iterator.next();}iterator.next(); ``` 結果取決于 Iterator 在不同異常中的實現,但是如果實現遵循接口的約定,則會得到 java.util.NoSuchElementException: ```java Exception in thread "main" java.util.NoSuchElementException at java.util.AbstractList$Itr.next(AbstractList.java:364) ``` 這意味著,您只能將一個迭代器導航到末尾。 ## 使用`for`循環 解決上述問題的方法是使用`for`循環。 除了解決上述問題之外,它還使您的代碼更清晰,更易讀。 并且避免在循環后使用迭代器導致異常: ```java for (Iterator ranks = Arrays.asList("2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A").iterator(); ranks.hasNext(); ) { String rank = ranks.next(); for (Iterator suits = Arrays.asList("HEARTS", "SPADES", "CLUBS", "DIAMONDS").iterator(); suits.hasNext(); ) { String suit = suits.next();System.out.println(suit + " " + rank);}} ``` 另外,您可以利用增強的`for`循環使您的解決方案更具可讀性: ```java for (String rank : Arrays.asList("2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A")) { for (String suit : Arrays.asList("HEARTS", "SPADES", "CLUBS", "DIAMONDS")) { System.out.println(suit + " " + rank); }} ``` 而且,作為一個很好的副作用,我們甚至不需要了解`Iterator`接口的工作原理,它全都封裝在 Java 運行時的精巧手下。 ### 移除元素 另一個常見的問題是在使用集合刪除元素時。 不會導致錯誤或復制列表的最可行解決方案是使用`Iterator`接口: ```java List numbers = new ArrayList<>(Arrays.asList(1, 4, 223, 56, 23, 88, 346, 78, 45, 33));Iterator iterator = numbers.iterator();while (iterator.hasNext()) { if (iterator.next() > 100) { iterator.remove(); }} ``` 上面的這段代碼從列表中刪除了所有大于 100 的元素。如您所見,這里我們需要將列表的整個創建包裝到一個顯式的`ArrayList`構造器中。 這是因為`java.util.Arrays`是如何工作的:它返回一個不支持修改的特殊`ArrayList`。 因此,如果您嘗試刪除元素,則會出現異常。 同樣,請注意如何使用迭代器! ```java List numbers = new ArrayList<>(Arrays.asList(1, 4, 223, 56, 23, 88, 346, 78, 45, 33));Iterator iterator = numbers.iterator();while (iterator.hasNext()) { if (iterator.next() < 0 || iterator.next() > 100) { iterator.remove(); }} System.out.println(numbers); ``` 此代碼導致以下結果: ```java [1, 4, 223, 56, 23, 88, 346, 78, 45, 33] ``` 如您所見,元素未更改。 為什么? 因為`if`條件在條件的兩邊都調用`iterator.next()`,在這種情況下,我們跳過了大的值。 如果列表中包含奇數個元素,我們將獲得異常而不是意外的結果。 我們將在后面的文章中看到,有一種更好和更易讀的方式從集合中刪除元素。 ### `forEachRemaining` `forEachRemaining`方法是 Java 8 中的新增功能。它獲取`java.util.function.Consumer`作為參數,該參數將為迭代器的每個其余元素調用。 目前,我看不到任何可以從這種新方法中受益的用例,但是應該有 Java 開發人員將其添加到組合中。 無論如何,想像一下,您要打印迭代器的所有元素,這些元素在大于 100 的第一個元素之后。您可以這樣進行: 也有一些不同的解決方案,但它們涉及自定義邏輯。 但是,使用這種新方法,您可以像下面這樣解決它: ```java Iterator iterator = Arrays.asList(1, 4, 223, 56, 23, 88, 346, 78, 45, 33).iterator();while (iterator.hasNext()) { if (iterator.next() > 100) { break; }} iterator.forEachRemaining(System.out::println); ``` 結果是: ```java 562388346784533 ``` 而且,如果迭代器結束了,并且沒有增加目標的任何元素,那么它也不會引發異常: ```java Iterator iterator = Arrays.asList(1, 4, 223, 56, 23, 88, 346, 78, 45, 33).iterator();while (iterator.hasNext()) { if (iterator.next() > 500) { break; }}iterator.forEachRemaining(System.out::println); ``` ## 總結 如果您有一個元素集合并且想要瀏覽它們 – 并從該集合中刪除元素,則`Iterator`接口是基本的解決方案。 這里的方法是有限的:您不能向該集合中添加元素,也不能向后導航...并且使用 Java **1.5** ,引入了新的集合接口,這使我們的開發人員的生活更加輕松。 在下一篇文章中,我們將研究`java.util.Collection`和`java.util.Iterable`接口,以為以后處理不同集合實現的文章奠定基礎。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看