Java中的集合迭代器

来源:https://www.cnblogs.com/ms27946/archive/2018/04/19/Iterable-Iterator-In-Java.html
-Advertisement-
Play Games

集合的迭代器 任何集合都有迭代器。 任何集合類,都必須能以某種方式存取元素,否則這個集合容器就沒有任何意義。 迭代器,也是一種模式(也叫迭代器模式)。在java中它是一個對象,其目的是遍歷並選中其中的每個元素,而使用者(客戶端)無需知道裡面的具體細節。迭代器要足夠的“輕量”——創建迭代器的代價小。所 ...


集合的迭代器

任何集合都有迭代器。

任何集合類,都必須能以某種方式存取元素,否則這個集合容器就沒有任何意義。

迭代器,也是一種模式(也叫迭代器模式)。在java中它是一個對象,其目的是遍歷並選中其中的每個元素,而使用者(客戶端)無需知道裡面的具體細節。迭代器要足夠的“輕量”——創建迭代器的代價小。所以看迭代器的源代碼就會發現,裡面會有很多要求:

  1. iterator方法返回一個Iterator,Iterator返回序列的頭元素。
  2. next方法獲取下一個元素
  3. hasNext檢查還有元素
  4. remove刪除迭代器新返回的元素

下麵是迭代器的基本使用

public class UsingIterator {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("marson", "shine", "summer", "zhu");
        Iterator<String> it = names.iterator();
        while(it.hasNext()){
            String s = it.next();
            print(s);
        }
        for (String s : names){
            print(s);
        }
        System.out.println();
        it = names.iterator();
        for (int i = 0; i < 4; i++) {
            it.next();
        }
        print(names);
    }
}

ListIterator

ListIterator是一個更強大的Iterator子類型,能用於各種List類訪問,前面說過Iterator支持單向取數據,ListIterator可以雙向移動,所以能指出迭代器當前位置的前一個和後一個索引,可以用set方法替換它訪問過的最後一個元素。我們可以通過調用listIterator方法產生一個指向List開始處的ListIterator,並且還可以用過重載方法listIterator(n)來創建一個指定列表索引為n的元素的ListIterator。

public class ListIteration {
    public static void main(String[] args) {
        var names = Arrays.asList("marson", "shine", "summer", "zhu");
        var it = names.listIterator();
        while (it.hasNext()) {
            print(it.next() + ", " + it.nextIndex() + ", " + it.previousIndex() + "; ");
        }

        while (it.hasPrevious()) {
            print(it.previous() + " ");
        }
        print(names);

        it = names.listIterator(3);
        while (it.hasNext()) {
            it.next();
            it.set("alias");
        }
        print(names);
    }
}

輸出結果為:


marson, 1, 0;
shine, 2, 1;
summer, 3, 2;
zhu, 4, 3;
zhu
summer
shine
marson
[marson, shine, summer, zhu][marson, shine, summer, alias]

Iterator模式

前面說了,迭代器又叫迭代器模式,顧名思義,只要符合這種模式都能叫迭代器模式,自然也能像前面一樣使用迭代器

那麼Iterator模式具體是個什麼樣子的模式呢?

我們通過Collection的源碼發現其中的樣子(為什麼要看Collection而不是其他的List?因為Collection是所有容器的基類啊)

通過Collection代碼我們發現它繼承了一個叫Iterable<T>介面,註解說的很清楚——實現這個介面就說明這個對象是可迭代的;並且其成員函數也很清晰,只有三個方法

public interface Iterable<T> {
    Iterator<T> iterator();
    default void forEach(Consumer<? super T> action);   //省略部分代碼
    default Spliterator<T> spliterator();   //省略部分代碼public interface Iterator<E> {
    boolean hasNext();
    E next();
    default void remove() {
        throw new UnsupportedOperationException("remove");
    }
    ...
}

Iterator這個泛型介面才是我們真正實現迭代的核心,通過這些信息我們嘗試來寫一個迭代器

public class CustomIterator implements Iterable<String> {
    protected String[] names = ("marson shine summer zhu").split(" ");
    public Iterator<String> iterator() {
        return new Iterator<String>() {
            private int index = 0;
            @Override
            public boolean hasNext() {
                return index < names.length;
            }
            @Override
            public String next() {
                return names[index++];
            }
            public void remove() {
            }
        };
    }
    public static void main(String[] agrs) {
        for (var s : new CustomIterator()) {
            print(s + " ");
        }
    }
}

到這裡,自定義的迭代器就寫完了,實際上我們只需要繼承一個Iterable介面然後實現這個介面就行了,更深入的話,其實還可以自己寫一個listIterator實現雙向的操作數據


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.安裝Java環境 安裝了Java環境直接下一步,沒有安裝的話:http://www.cnblogs.com/i-tao/p/8587279.html 2.安裝Eclipse開發工具 安裝了Eclipse直接下一步,沒有安裝直接去官網下載Eclipse:https://www.eclipse.or ...
  • 原文地址:http://hadihariri.com/2014/06/24/no-tabs-in-intellij-idea/ I often come across people complaining about some odd behaviour when it comes to edito ...
  • @ResponseBody 在返回的數據不是html標簽的頁面,而是其他某種格式的數據時(如json、xml等)使用; 不在springMvc中配置json的處理的話,我們通常會在Controller層中獲取到數據之後進行類型轉化,將數據轉成json字元串,比如調用fastjson進行轉化,如下 這 ...
  • 手把手教你寫網路爬蟲(4) 作者:拓海 摘要:從零開始寫爬蟲,初學者的速成指南! 封面: 上期我們理性的分析了為什麼要學習Scrapy,理由只有一個,那就是免費,一分錢都不用花! 咦?怎麼有人扔西紅柿?好吧,我承認電視看多了。不過今天是沒得看了,為了趕稿,又是一個不眠夜。。。言歸正傳,我們將在這一期 ...
  • 在進行網頁數據抓取時我們要先安裝一個模塊 requests 通過終端安裝如下圖 因為我之前安裝過了,所以不會顯示安裝進度條,安裝也非常簡單,如果你配置好環境變數的話,你只需要執行以下命令 如果提示要升級,就按下麵升級pip 安裝完模塊後我們正式開始進行數據爬取 先說一下requests的用法,導入這 ...
  • 用for迴圈對無序數組進行排序輸出。 public class BubbleSort{ public static void main (String [] args){ int a[] = {21,9,45,17,33,72,50,12,41,39}; for (int i=a.length; - ...
  • MyBatis—Spring 項目 目前大部分的 Java 互聯網項目,都是用 Spring MVC + Spring + MyBatis 搭建平臺的。 使用 "Spring IoC" 可以有效的管理各類的 Java 資源,達到即插即拔的功能;通過 "Spring AOP" 框架,資料庫事務可以委托 ...
  • 內容:日曆對象獲取時間,設置時間,日期偏移 通過工廠化獲得對象。getInstance();get() 獲取時間信息 美國的星期是從星期天開始的,所以會有點問題set()設置方法,設置時間 //解答三月一日的前一天就是 Calendar c = Calendar.getInstance(); int ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...