Java基礎篇(03):流程式控制制語句,和演算法應用

来源:https://www.cnblogs.com/cicada-smile/archive/2020/07/26/13380832.html
-Advertisement-
Play Games

本文源碼:GitHub·點這裡 || GitEE·點這裡 一、分支語句 流程式控制制語句對任何一門編程語言都是非常重要的,Java中基於流程式控制製程序執行的不同步驟和代碼塊。 1、IF條件 IF條件語句會根據不同的判斷條件執行不同的語句,if後括弧內的條件是否成立關鍵步驟,IF條件的判斷結果必然要是tru ...


本文源碼:GitHub·點這裡 || GitEE·點這裡

一、分支語句

流程式控制制語句對任何一門編程語言都是非常重要的,Java中基於流程式控制製程序執行的不同步驟和代碼塊。

1、IF條件

IF條件語句會根據不同的判斷條件執行不同的語句,if後括弧內的條件是否成立關鍵步驟,IF條件的判斷結果必然要是true或false。IF...Else語句則是滿足IF條件,就執行相應代碼塊,否則就執行Elase代碼塊。

public class Process01 {
    public static void main(String[] args) {
        // 演示:Node01
        if (compare01(40,30)){
            System.out.println("40>30:true");
        } else {
            System.out.println("40>30:false");
        }
        // 演示:Node02
        if (compare01(10,20) && compare01(20,30)){
            System.out.println("條件成立");
        } else {
            System.out.println("條件不成立");
        }
        // 演示:Node03
        if (compare01(20,10) || compare01(20,30)){
            System.out.println("條件成立");
        } else {
            System.out.println("條件不成立");
        }
        // 演示:Node04
        if(compare02(1,1))
            if(compare02(2,2))
                System.out.println("Running...");
        // 演示:Node05
        if(compare01(1,2))
            if(compare01(5,3)){
                System.out.println("5>3");
            }
    }

    private static boolean compare01 (int num1,int num2){
        System.out.println("判斷:num1="+num1+";num2="+num2);
        return num1 > num2 ;
    }
    private static boolean compare02 (int num1,int num2){
        System.out.println("判斷:num1="+num1+";num2="+num2);
        return num1 == num2 ;
    }
}

節點案例,測試結果描述:

  • Node01:如果if條件不成立,則執行else流程或者結束;
  • Node02:邏輯且判斷,任何條件不成立,則直接結束;
  • Node03:邏輯或判斷,任何條件成立,則直接進入分支;
  • Node04:IF的格式,可以去掉{},後續語句會作為分支;
  • Node05:IF語句面試題,不會輸出任何內容,第二個語句作為分支;

註意:在流程式控制制語句中必須使用大括弧,即使只有一行代碼,避免採用單行的編碼方式,這是基礎規範。在上面的測試節點4和5,代碼看著就感覺扎心。

2、IF-Else-IF條件

Else...IF分支語句用於多種情況進行的判斷處理,直到分支判斷條件成功,執行分支模塊代碼,如果沒有else條件,可以所有分支都不滿足,直接結束。

public class Process02 {
    public static void main(String[] args) {
        elseIf(11) ;
        elseIf(9) ;
        elseIf(5);
    }

    private static void elseIf (Integer num){
        if (num > 10){
            System.out.println("num > 10");
        } else if (num > 7){
            System.out.println("num > 7");
        } else if (num > 4){
            System.out.println("num > 4");
        } else {
            System.out.println("num < 4");
        }
    }
}

註意:根據條件逐個判斷,直到找到第一個滿足的條件,不會再繼續往下麵的判斷執行,分支語句執行完畢就會退出當前的else...if流程。超過3層的的邏輯判斷代碼可以使用衛語句、策略模式、狀態模式等來實現。

3、Switch條件

流程描述:switch語句先獲取表達式的值,判斷表達式的值與case語句後的常量值是否相同,匹配成功則執行該case後的代碼塊,直到遇到break語句後終止,如果缺失break打斷,則繼續匹配下一case常量,直到遇到break為止。如果條件全不匹配,則執行default後面的語句。default語句可選,如果不存在default語句,同一個switch語句,case的常量值必須互不相同。

public class Process03 {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.print("What day is it today:");
        String value = scan.next();
        weekInfo(value);
    }

    private static void weekInfo (String value){
        switch (value) {
            case "Monday":
                System.out.println("Monday");
                break;
            case "Tuesday":
                System.out.println("Tuesday");
                break;
            case "Wednesday":
                System.out.println("Wednesday");
                break;
            case "Thursday":
                System.out.println("Thursday");
                break;
            case "Friday":
                System.out.println("Friday");
                break;
            case "Saturday":
                System.out.println("Saturday");
                break;
            case "Sunday":
                System.out.println("Sunday");
                break;
            default:
                System.out.println("Matching failure");
                break;
        }
    }
}

註意:從JDK1.7之後,switch支持對String字元串的匹配。

二、迴圈語句

迴圈語句就是在滿足特定條件的情況下,反覆執行同個操作。迴圈語句包括:for迴圈、while迴圈、do···while迴圈。

1、For迴圈

Java開發中最有用的迴圈方式,也是諸多演算法中的基礎控制語句,在常見的很多演算法編碼實現中,都需要藉助for迴圈方式。

public class Process04 {
    public static void main(String[] args) {
        // Node01
        int sum = 0;
        for(int i=1; i<=100; i++) {
            sum += i;
        }
        System.out.println(sum);

        // Node02
        String[] nameArr = {"Java","C++","C#"} ;
        for (String name:nameArr){
            System.out.println("name="+name);
        }

        // Node03
        // 輸出 i = 13
        int i = 0;
        for (i++; i++ < 10; i++);
        System.out.println(++i);

        // 輸出:j=3 6 9
        int j = 0;
        for (j++; j++ < 10; j++){
            System.out.println(++j);
        }
    }
}

節點案例,測試結果描述:

  • Node01:for迴圈作為計算中的常用方式;
  • Node02:foreach遍歷模式,簡化迴圈操作,也可以改寫為for語句;
  • Node03:迴圈for語句的基礎執行機制,兩道面試常見題;

註意:越是基礎的東西,學起來越難,for語句作為很多演算法實現的基礎控制,理解起來相當的繞。

2、While迴圈

while迴圈語句首先判斷條件是否成立,成立才執行迴圈體;

do···while迴圈語句先執行一次迴圈體,然後判斷條件是否成立,所以do···while至少會執行一次;

public class Process05 {
    public static void main(String[] args) {
        int num1 = 1;
        int num2 = 1;

        // while迴圈
        while(num1 <= 3) {
            System.out.println("num1 == " + num1);
            num1++;
        }

        // do...while迴圈
        do {
            System.out.println("num2 == " + num2);
            num2++;
        } while(num2 <= 3);
    }
}

註意:while迴圈在實際的開發中,因為極其容易導致死迴圈,所以使用並不多。

三、流程中斷

Java中有三種流程中斷語句,關鍵字分別為break、continue、return語句。

1、Return語句

Java中最常用的流程式控制制關鍵字,當執行return語句後,從該方法返回,返回到調用該方法的業務流程中。

public class Process06 {
    public static void main(String[] args) {
        System.out.println(getNum1());
        System.out.println(getNum2());
    }
    public static int getNum1 (){
        int a =100;
        try{
            return a+1;   // 這裡是運算邏輯,非賦值
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            return a;
        }
    }
    public static int getNum2 (){
        int a =100;
        try{
            return a++;   //  a++ -> a=a+1 此時a的值改變
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            return a;
        }
    }
}

return 常在位置

  • return語句只在方法最後出現一次。
  • return語句僅在try和catch裡面都出現。
  • return語句僅在try和方法最後都出現。
  • return語句僅在catch和方法的最後都出現。

2、Break語句

break中斷語句常用在for、while、do···while迴圈中,用於退出當前整個迴圈流程,非當前這一次迴圈。

public class Process07 {
    public static void main(String[] args) {
        for (int i = 1 ; i < 3 ; i++){
            if (i == 2){
                break ;
            }
            System.out.println("i = " + i);
        }
    }
}

3、Continue語句

Continue中斷語句常用在for、while、do···while迴圈中,用於退出當前這一次迴圈,進入下一次迴圈。

public class Process08 {
    public static void main(String[] args) {
        for (int i = 1 ; i < 3 ; i++){
            if (i == 1){
                continue ;
            }
            System.out.println("i = " + i);
        }
    }
}

四、應用場景

1、冒泡排序演算法

public class Process09 {
    public static void main(String[] args) {
        int[] score = {9,8,7,6,5} ;
        // 排序次數:最多 length - 1 次
        for (int i = 0 ; i < score.length -1 ; i ++){
            // 當前排序的集合區間,排序完一個數據就放棄一個
            for (int j = 0 ; j < score.length - i - 1 ; j++){
                // 冒泡排序:把結果大的向後扔
                if (score[j] > score[j+1]){
                    int temp = score[j] ;
                    score[j] = score[j+1] ;
                    score[j+1] = temp ;
                }
            }
        }
        // 輸出排序後的結果集
        for (int i = 0 ; i < score.length ; i++){
            System.out.print(score[i]);
        }
    }
}

2、排列組合演算法

有1、2、3、4個數字,能組成多少個互不相同且無重覆數字的三位數?都是多少?

public class Process10 {
    public static void main(String[] args) {
        arrange() ;
    }
    public static void arrange (){
        int i=0; // 百位數
        int j=0; // 十位數
        int k=0; // 個位數
        int t=0; // 計數器
        for (i = 1 ; i <= 4 ; i++){
            for (j = 1 ; j <= 4 ; j++){
                for (k = 1 ; k <=4 ; k++){
                    if (i != j && j != k && k != i){
                        t += 1 ;
                        System.out.print(i*100+j*10+k+"--");
                    }
                }
            }
        }
        System.out.println();
        System.out.println("t="+t);
    }
}

3、遞歸常見演算法

基於遞歸思想的各種計算方法實現。

public class Process11 {
    public static void main(String[] args) {
        System.out.println(getSumOne(100));
        System.out.println(getSumTwo(30));
        System.out.println(getSumThree(5));
    }
    /**
     * 使用遞歸的方式計算1+2+...+100
     */
    public static int getSumOne (int i){ // 傳入100
        int sum ;
        if (i == 1){
            return 1 ;
        }
        else {
            sum = i + getSumOne(i - 1) ;
        }
        return sum ;
    }
    /**
     * 一列數的規則如下: 1、1、2、3、5、8、13、21、34...
     * 求第30位數是多少, 用遞歸演算法實現
     */
    public static int getSumTwo (int i){ // 傳入第幾位數下標
        if (i <= 0){
            return 0 ;
        } else if (i == 1 || i == 2){ // 處理前面2位的1,1
            return 1 ;
        } else { // 當前位數是前兩位之和
            return getSumTwo(i - 1) + getSumTwo(i - 2) ;
        }
    }
    /**
     * 1*2*3*...*100 遞歸計算階乘
     */
    public static int getSumThree (int i){
        if (i == 1){
            return i ;
        } else {
            return i * getSumThree (i - 1) ;
        }
    }
}

五、源代碼地址

GitHub·地址
https://github.com/cicadasmile/java-base-parent
GitEE·地址
https://gitee.com/cicadasmile/java-base-parent

推薦閱讀:Java基礎系列

序號 文章標題
01 Java基礎:基本數據類型,核心點整理
02 Java基礎:特殊的String類,和相關擴展API
01 Java併發:線程的創建方式,狀態周期管理
02 Java併發:線程核心機制,基礎概念擴展
03 Java併發:多線程併發訪問,同步控制
04 Java併發:線程間通信,等待/通知機制
05 Java併發:悲觀鎖和樂觀鎖機制
06 Java併發:Lock機制下API用法詳解

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

-Advertisement-
Play Games
更多相關文章
  • 一 JDBC簡介 Java DataBase Connectivity Java語言連接資料庫 官方(Sun公司)定義的一套操作所有關係型資料庫的規則(介面) 各個資料庫廠商去實現這套介面 提供資料庫驅動JAR包 可以使用這套介面(JDBC)編程 真正執行的代碼是驅動JAR包中的實現類 二 JDBC ...
  • 題目描述:這裡 思路: 一、部分分演算法 對於的數據,用暴力解決即可,時間複雜度 對於另外的數據(所有木棍長度相等),考慮用組合數學,答案為 二、正解 我們考慮對整個序列進行桶排序。 我們設每個數出現的次數為。 對於所有≥的數,加上比它小的所有數出現的次數,並加上這個數至這個數中所有數出現的個數。 特 ...
  • 區別維度: 1. 可變性 a. String用final修飾,不可變 b. Stringbuilder和StringBuffer均繼承抽象父類AbstractStringBuilder,其中也是用char[]數組儲存字元串,但無final修飾 2. 線程安全性:源碼中StringBuilder和St ...
  • 雖然Python的強項在人工智慧,數據處理方面,但是對於日常簡單的應用,Python也提供了非常友好的支持(如:Tkinter),本文主要一個簡單的畫圖小軟體,簡述Python在GUI(圖形用戶界面)方面的應用,僅供學習分享使用,如有不足之處,還請指正。 ...
  • Debug LinkedList源碼 前置知識 LinkedList基於鏈表,LinkedList的Node節點定義 成員變數 //鏈表中元素的數量 transient int size = 0; /** * 鏈表的頭節點:用於遍歷 */ transient Node<E> first; /** * ...
  • 1 int StringSearch(char str[], char strSearch[]) 2 { 3 int i = -1; 4 while (str[i]) 5 { 6 char c = strSearch[0];//鎖定查找字元的第1位置 7 if (str[i] != c)//判斷查找 ...
  • 學習就是為了不斷的看到自己的知識盲點,然後改正,以前知道如何使用break來跳出迴圈,突然學習到可以用break跳出外部的迴圈(以前只知道怎麼調本次的迴圈)。 上正題代碼如下: break跳出本次迴圈: public static void main(String[] args) { for (in ...
  • 功能介紹 客戶端給所有線上用戶發送消息 客戶端給指定線上用戶發送消息 伺服器給客戶端發送消息(輪詢方式) 註意:socket只是實現一些簡單的功能,具體的還需根據自身情況,代碼稍微改造下 項目搭建 項目結構圖 pom.xml <?xml version="1.0" encoding="UTF-8"? ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...