最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java技巧函數(shù)方法實(shí)現(xiàn)二維數(shù)組遍歷

 更新時(shí)間:2022年08月08日 14:22:54   作者:一灰灰???????  
這篇文章主要介紹了Java技巧函數(shù)方法實(shí)現(xiàn)二維數(shù)組遍歷,二維數(shù)組遍歷,每個(gè)元素判斷下是否為偶數(shù),相關(guān)內(nèi)容需要的小伙伴可以參考一下

前言

對于數(shù)組遍歷,基本上每個(gè)開發(fā)者都寫過,遍歷本身沒什么好說的,但是當(dāng)我們在遍歷的過程中,有一些復(fù)雜的業(yè)務(wù)邏輯時(shí),將會發(fā)現(xiàn)代碼的層級會逐漸加深

如一個(gè)簡單的case,將一個(gè)二維數(shù)組中的偶數(shù)找出來,保存到一個(gè)列表中

二維數(shù)組遍歷,每個(gè)元素判斷下是否為偶數(shù),很容易就可以寫出來,如:

public void getEven() {
    int[][] cells = new int[][]{{1, 2, 3, 4}, {11, 12, 13, 14}, {21, 22, 23, 24}};
    List<Integer> ans = new ArrayList<>();
    for (int i = 0; i < cells.length; i ++) {
        for (int j = 0; j < cells[0].length; j++) {
            if ((cells[i][j] & 1) == 0) {
                ans.add(cells[i][j]);
            }
        }
    }
    System.out.println(ans);
}

上面這個(gè)實(shí)現(xiàn)沒啥問題,但是這個(gè)代碼的深度很容易就有三層了;當(dāng)上面這個(gè)if中如果再有其他的判定條件,那么這個(gè)代碼層級很容易增加了;二維數(shù)組還好,如果是三維數(shù)組,一個(gè)遍歷就是三層;再加點(diǎn)邏輯,四層、五層不也是分分鐘的事情么

那么問題來了,代碼層級變多之后會有什么問題呢?

只要代碼能跑,又能有什么問題呢?!

1. 函數(shù)方法消減代碼層級

由于多維數(shù)組的遍歷層級天然就很深,那么有辦法進(jìn)行消減么?

要解決這個(gè)問題,關(guān)鍵是要抓住重點(diǎn),遍歷的重點(diǎn)是什么?獲取每個(gè)元素的坐標(biāo)!那么我們可以怎么辦?

定義一個(gè)函數(shù)方法,輸入的就是函數(shù)坐標(biāo),在這個(gè)函數(shù)體中執(zhí)行我們的遍歷邏輯即可

基于上面這個(gè)思路,相信我們可以很容易寫一個(gè)二維的數(shù)組遍歷通用方法

public static void scan(int maxX, int maxY, BiConsumer<Integer, Integer> consumer) {
    for (int i = 0; i < maxX; i++) {
        for (int j = 0; j < maxY; j++) {
            consumer.accept(i, j);
        }
    }
}

主要上面的實(shí)現(xiàn),函數(shù)方法直接使用了JDK默認(rèn)提供的BiConsumer,兩個(gè)傳參,都是int 數(shù)組下表;無返回值

那么上面這個(gè)怎么用呢?

同樣是上面的例子,改一下之后,如:

public void getEven() {
    int[][] cells = new int[][]{{1, 2, 3, 4}, {11, 12, 13, 14}, {21, 22, 23, 24}};
    List<Integer> ans = new ArrayList<>();
    scan(cells.length, cells[0].length, (i, j) -> {
        if ((cells[i][j] & 1) == 0) {
            ans.add(cells[i][j]);
        }
    });
    System.out.println(ans);
}

相比于前面的,貌似也就少了一層而已,好像也沒什么了不起的

但是,當(dāng)數(shù)組變?yōu)槿S、四維、無維時(shí),這個(gè)改動的寫法層級都不會變哦

2. 遍歷中return支持

前面的實(shí)現(xiàn)對于正常的遍歷沒啥問題;但是當(dāng)我們在遍歷過程中,遇到某個(gè)條件直接返回,能支持么?

如一個(gè)遍歷二維數(shù)組,我們希望判斷其中是否有偶數(shù),那么可以怎么整?

仔細(xì)琢磨一下我們的scan方法,希望可以支持return,主要的問題點(diǎn)就是這個(gè)函數(shù)方法執(zhí)行之后,我該怎么知道是繼續(xù)循環(huán)還是直接return呢?

很容易想到的就是執(zhí)行邏輯中,添加一個(gè)額外的返回值,用于標(biāo)記是否中斷循環(huán)直接返回

基于此思路,我們可以實(shí)現(xiàn)一個(gè)簡單的demo版本

定義一個(gè)函數(shù)方法,接受循環(huán)的下標(biāo) + 返回值

@FunctionalInterface
public interface ScanProcess<T> {
    ImmutablePair<Boolean, T> accept(int i, int j);
}

循環(huán)通用方法就可以相應(yīng)的改成:

public static <T> T scanReturn(int x, int y, ScanProcess<T> func) {
    for (int i = 0; i < x; i++) {
        for (int j = 0; j < y; j++) {
            ImmutablePair<Boolean, T> ans = func.accept(i, j);
            if (ans != null && ans.left) {
                return ans.right;
            }
        }
    }
    return null;
}

基于上面這種思路,我們的實(shí)際使用姿勢如下:

@Test
public void getEven() {
    int[][] cells = new int[][]{{1, 2, 3, 4}, {11, 12, 13, 14}, {21, 22, 23, 24}};
    List<Integer> ans = new ArrayList<>();
    scanReturn(cells.length, cells[0].length, (i, j) -> {
        if ((cells[i][j] & 1) == 0) {
            return ImmutablePair.of(true, i + "_" + j);
        }
        return ImmutablePair.of(false, null);
    });
    System.out.println(ans);
}

上面這個(gè)實(shí)現(xiàn)可滿足我們的需求,唯一有個(gè)別扭的地方就是返回,總有點(diǎn)不太優(yōu)雅;那么除了這種方式之外,還有其他的方式么?

既然考慮了返回值,那么再考慮一下傳參呢?通過一個(gè)定義的參數(shù)來裝在是否中斷以及返回結(jié)果,是否可行呢?

基于這個(gè)思路,我們可以先定義一個(gè)參數(shù)包裝類:

public static class Ans<T> {
    private T ans;
    private boolean tag = false;

    public Ans<T> setAns(T ans) {
        tag = true;
        this.ans = ans;
        return this;
    }

    public T getAns() {
        return ans;
    }
}

public interface ScanFunc<T> {
    void accept(int i, int j, Ans<T> ans)
}

我們希望通過Ans這個(gè)類來記錄循環(huán)結(jié)果,其中tag=true,則表示不用繼續(xù)循環(huán)了,直接返回ans結(jié)果吧

與之對應(yīng)的方法改造及實(shí)例如下:

public static <T> T scanReturn(int x, int y, ScanFunc<T> func) {
    Ans<T> ans = new Ans<>();
    for (int i = 0; i < x; i++) {
        for (int j = 0; j < y; j++) {
            func.accept(i, j, ans);
            if (ans.tag) {
                return ans.ans;
            }
        }
    }
    return null;
}
public void getEven() {
    int[][] cells = new int[][]{{1, 2, 3, 4}, {11, 12, 13, 14}, {21, 22, 23, 24}};
    String ans = scanReturn(cells.length, cells[0].length, (i, j, a) -> {
        if ((cells[i][j] & 1) == 0) {
            a.setAns(i + "_" + j);
        }
    });
    System.out.println(ans);
}

這樣看起來就比前面的要好一點(diǎn)了

實(shí)際跑一下,看下輸出是否和我們預(yù)期的一致;

到此這篇關(guān)于Java技巧函數(shù)方法實(shí)現(xiàn)二維數(shù)組遍歷的文章就介紹到這了,更多相關(guān)Java數(shù)組遍歷內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決Spring Boot 在localhost域奇怪的404問題(Mac book pro)

    解決Spring Boot 在localhost域奇怪的404問題(Mac book pro)

    這篇文章主要介紹了解決Spring Boot 在localhost域奇怪的404問題(Mac book pro),需要的朋友可以參考下
    2017-09-09
  • 詳細(xì)分析java并發(fā)之volatile關(guān)鍵字

    詳細(xì)分析java并發(fā)之volatile關(guān)鍵字

    這篇文章主要介紹了java并發(fā)之volatile關(guān)鍵字的的相關(guān)資料,文中代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • 一文講解如何優(yōu)雅的調(diào)試jar包

    一文講解如何優(yōu)雅的調(diào)試jar包

    在現(xiàn)實(shí)開發(fā)過程中,現(xiàn)場環(huán)境永遠(yuǎn)比開發(fā)環(huán)境復(fù)雜,下面這篇文章主要給大家介紹了關(guān)于如何優(yōu)雅的調(diào)試jar包的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • Java?精煉解讀數(shù)據(jù)結(jié)構(gòu)的順序表如何操作

    Java?精煉解讀數(shù)據(jù)結(jié)構(gòu)的順序表如何操作

    程序中經(jīng)常需要將一組數(shù)據(jù)元素作為整體管理和使用,需要?jiǎng)?chuàng)建這種元素組,用變量記錄它們,傳進(jìn)傳出函數(shù)等。一組數(shù)據(jù)中包含的元素個(gè)數(shù)可能發(fā)生變化,順序表則是將元素順序地存放在一塊連續(xù)的存儲區(qū)里,元素間的順序關(guān)系由它們的存儲順序自然表示
    2022-03-03
  • Spring Data JPA實(shí)現(xiàn)排序與分頁查詢超詳細(xì)流程講解

    Spring Data JPA實(shí)現(xiàn)排序與分頁查詢超詳細(xì)流程講解

    在介紹Spring Data JPA的時(shí)候,我們首先認(rèn)識下Hibernate。Hibernate是數(shù)據(jù)訪問解決技術(shù)的絕對霸主,使用O/R映射技術(shù)實(shí)現(xiàn)數(shù)據(jù)訪問,O/R映射即將領(lǐng)域模型類和數(shù)據(jù)庫的表進(jìn)行映射,通過程序操作對象而實(shí)現(xiàn)表數(shù)據(jù)操作的能力,讓數(shù)據(jù)訪問操作無須關(guān)注數(shù)據(jù)庫相關(guān)的技術(shù)
    2022-10-10
  • Java實(shí)現(xiàn)矩陣乘法以及優(yōu)化的方法實(shí)例

    Java實(shí)現(xiàn)矩陣乘法以及優(yōu)化的方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)矩陣乘法以及優(yōu)化的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Java8之lambda表達(dá)式基本語法

    Java8之lambda表達(dá)式基本語法

    本文通過示例大家給大家介紹了java8之lambda表達(dá)式的基本語法,感興趣的的朋友一起看看吧
    2017-08-08
  • springcloud使用consul作為配置中心

    springcloud使用consul作為配置中心

    這篇文章主要介紹了springcloud使用consul作為配置中心,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06
  • Java優(yōu)秀類庫Hutool使用示例

    Java優(yōu)秀類庫Hutool使用示例

    Hutool是一個(gè)小而全的Java工具類庫,通過靜態(tài)方法封裝,降低相關(guān)API的學(xué)習(xí)成本,提高工作效率,涵蓋了Java開發(fā)開發(fā)中的方方面面,使用Hutool可節(jié)省開發(fā)人員對項(xiàng)目中公用類和公用工具方法的封裝時(shí)間,使開發(fā)專注于業(yè)務(wù),同時(shí)可以最大限度的避免封裝不完善帶來的bug
    2023-02-02
  • spring?boot如何配置靜態(tài)路徑詳解(404出現(xiàn)的坑)

    spring?boot如何配置靜態(tài)路徑詳解(404出現(xiàn)的坑)

    這篇文章主要給大家介紹了關(guān)于spring?boot如何配置靜態(tài)路徑的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-02-02

最新評論

商南县| 尼勒克县| 黔西县| 南投市| 垫江县| 苏尼特右旗| 二连浩特市| 福清市| 谷城县| 永德县| 延边| 板桥市| 和平区| 正宁县| 西和县| 新密市| 长海县| 大兴区| 黄大仙区| 郯城县| 丰县| 宜君县| 巴楚县| 广元市| 通榆县| 明星| 宁南县| 开封市| 昭苏县| 鸡泽县| 荔浦县| 肇东市| 青海省| 克什克腾旗| 孝义市| 侯马市| 黎城县| 韶关市| 浠水县| 玉门市| 天津市|