真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

怎么在Java中使用函數(shù)實(shí)現(xiàn)二維數(shù)組的遍歷

這篇“怎么在Java中使用函數(shù)實(shí)現(xiàn)二維數(shù)組的遍歷”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“怎么在Java中使用函數(shù)實(shí)現(xiàn)二維數(shù)組的遍歷”文章吧。

青州ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為成都創(chuàng)新互聯(lián)的ssl證書(shū)銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書(shū)合作)期待與您的合作!

前言

對(duì)于數(shù)組遍歷,基本上每個(gè)開(kāi)發(fā)者都寫(xiě)過(guò),遍歷本身沒(méi)什么好說(shuō)的,但是當(dāng)我們?cè)诒闅v的過(guò)程中,有一些復(fù)雜的業(yè)務(wù)邏輯時(shí),將會(huì)發(fā)現(xiàn)代碼的層級(jí)會(huì)逐漸加深

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

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

public void getEven() {
    int[][] cells = new int[][]{{1, 2, 3, 4}, {11, 12, 13, 14}, {21, 22, 23, 24}};
    List 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)沒(méi)啥問(wèn)題,但是這個(gè)代碼的深度很容易就有三層了;當(dāng)上面這個(gè)if中如果再有其他的判定條件,那么這個(gè)代碼層級(jí)很容易增加了;二維數(shù)組還好,如果是三維數(shù)組,一個(gè)遍歷就是三層;再加點(diǎn)邏輯,四層、五層不也是分分鐘的事情么

那么問(wèn)題來(lái)了,代碼層級(jí)變多之后會(huì)有什么問(wèn)題呢?

只要代碼能跑,又能有什么問(wèn)題呢?!

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

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

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

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

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

public static void scan(int maxX, int maxY, BiConsumer 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ù)組下表;無(wú)返回值

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

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

public void getEven() {
    int[][] cells = new int[][]{{1, 2, 3, 4}, {11, 12, 13, 14}, {21, 22, 23, 24}};
    List 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);
}

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

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

2. 遍歷中return支持

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

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

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

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

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

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

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

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

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

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

@Test
public void getEven() {
    int[][] cells = new int[][]{{1, 2, 3, 4}, {11, 12, 13, 14}, {21, 22, 23, 24}};
    List 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)雅;那么除了這種方式之外,還有其他的方式么?

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

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

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

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

    public T getAns() {
        return ans;
    }
}

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

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

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

public static  T scanReturn(int x, int y, ScanFunc func) {
    Ans 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);
}

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

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

怎么在Java中使用函數(shù)實(shí)現(xiàn)二維數(shù)組的遍歷

以上就是關(guān)于“怎么在Java中使用函數(shù)實(shí)現(xiàn)二維數(shù)組的遍歷”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


網(wǎng)頁(yè)題目:怎么在Java中使用函數(shù)實(shí)現(xiàn)二維數(shù)組的遍歷
文章出自:http://weahome.cn/article/popdci.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部