Java學習-第一部分-第一階段-第五節:數組、排序和查找

来源:https://www.cnblogs.com/wenjie2000/archive/2022/07/01/16433152.html
-Advertisement-
Play Games

數組、排序和查找 數組 數組介紹 數組可以存放多個同一類型的數據。數組也是一種數據類型,是引用類型。即:數組就是一組數據 數組快速入門 //1. double[]表示是double類型的數組,數組名hens //2.{3,5,1,3.4,2,50}表示數組的值/元素,依次表示數組的 //第幾個元素 ...


數組、排序和查找

數組

數組介紹

數組可以存放多個同一類型的數據。數組也是一種數據類型,是引用類型。即:數組就是一組數據

數組快速入門

//1. double[]表示是double類型的數組,數組名hens
//2.{3,5,1,3.4,2,50}表示數組的值/元素,依次表示數組的
//第幾個元素
//
double[] hens = {3,5,1,3.4,2,50};
//遍曆數組得到數組的所有元素的和,使用for
//1.我們可以通過 hens[下標]來訪問數組的元素
//下標是從日開始編號的比如第一個元素就是 hens[o]
//第2個元素就是 hens[1],依次類推
//2.通過for就可以迴圈的訪問數組的元素/值
//老師提示:可以通過數組名·length得到數組的大小/長度
System.out.println("數組的長度=" + hens.length);
for( int i = 0; i < 6; i++){
    System.out.println("第"+(i+1)+"個元素的值=" + hens[i]);
}

數組的使用

●使用方式1-動態初始化
數組的定義

數據類型數組名=new 數據類型[大小]
int a[]=new int[5];//創建了一個數組,名字a,存放5個int

●使用方式2-動態初始化

√先聲明數組
語法:數據類型數組名;也可以數據類型[數組名;
int a[];或者int[] a;

√創建數組
語法:數組名=new數據類型[大小;
a=new int[10];

√案例演示【前面修改即可】

//(2)第2種動態分配方式,先聲明數組,再new分配空間
double scores[] ;//聲明數組,這時scores是null
scores = new double[5];// 分配記憶體空間,可以存放數據

使用方式3-靜態初始化

初始化數組
語法:數據類型 數組名[]={元素值,元素值...)
int a[]={2,5,6,7,8,89,90,34,5,6},如果知道數組有多少元素,具體值上面的用法相當於:

int a[=new int[9];
a[0]=2;a[1]=5;a[2]=6; a[3]=7;a[4]=8;
a[5]=89;a[6]=90;a[7]=34;a[8]=56;

√快速入門案例【養雞場】

double hensl={3.5.1.3.4.2.50];等價
double hens[ = new double[6];
hens[0] = 3; hens[1] = 5; hens[2] = 1; hens[3] = 3.4; hens[4]=2;hens[5] = 50;

數組使用註意事項和細節

  1. 數組是多個相同類型數據的組合,實現對這些數據的統一管理
  2. 數組中的元素可以是任何數據類型,包括基本類型和引用類型,但是不能混用。
  3. 數組創建後,如果沒有賦值,有預設值int 0, short 0, byte 0, long 0, float 0.0,double 0.0, char \u0000,boolean false,String null
  4. 使用數組的步驟1.聲明數組並開闢空間2.給數組各個元素賦值3.使用數組
  5. 數組的下標是從0開始的。
  6. 數組下標必須在指定範圍內使用,否則報:下標越界異常,比如 int[] arr=new int[5];則有效下標為0-4
  7. 數組屬引用類型,數組型數據是對象(object)

數組賦值機制

  1. 基本數據類型賦值,這個值就是具體的數據,而且相互不影響。
    int n1 = 2; int n2 =n1;
  2. 數組在預設情況下是引用傳遞,賦的值是地址。看一個案例,並分析數組賦值的記憶體圖(重點)。
    int[] arr1 = {1,2,3};
    int[] arr2 = arr1;
//基本數據類型賦值,賦值方式為值拷貝
//n2的變化,不會影響到n1的值
int n1 = 10;
int n2 = n1;
n2 = 80;
System.out.print1n( "n1=" +n1);//10
System.out.print1n( "n2=" + n2);//80
//數組在預設情況下是引用傳遞,賦的值是地址,賦值方式為引用賦值
//是一個地址, arr2變化會影響到arr1
int[]arr1 = {1,2,3};
int[]arr2 = arr1;//把arr1賦給arr2
arr2[0] = 10;

//看看arr1的值
System.out.println( "====arr1的元素====");for(int i = 0; i < arr1.length; i++){
    System.out.println(arr1[i]);
}

JVM記憶體情況圖

image

數組拷貝

編寫代碼實現數組拷貝(內容複製)
將int[l] arr1 = {10,20,30};拷貝到arr2數組,要求數據空間是獨立的.

int[] arr1 = {10,20,30};

//創建一個新的數組arr2,開闢新的數據空間
//大小arr1.length;
int[] arr2 = new int[arr1.length];

//逼歷arr1 ,把每個元素拷貝到arr2對應的位置
for(int i = 0; i < arr1.length; i++){
    arr2[i] = arr1[i];
}

數組擴容

Scanner myScanner = new Scanner(System.in);//初始化數組
int[]arr = {1,2,3};
do{
    int[]arrNew = new int[arr.length + 1];
    //遍歷arr數組,依次將arr的元素拷貝到arrNew數組
    for(int i =0; i< arr.length; i++){
        arrNew[i] = arr[i];
    }
    System.out.println("請輸入你要添加的元素");
    int addNum = myScanner.nextInt();
    //把addNum賦給arrNew最後一個元素
    arrNew[ arrNew.length - 1] = addNum;
    //讓arr指向arrNew,
    arr = arrNew;
    //輸出arr看看效果
    System.out.println("====arr擴容後元素情況====");
    for(int i = 0; i < arr.length; i++){
        System.out.print(arr[i] + "\t");
    }
    //問用戶是//問用戶是否繼續
    System.out.println("是否繼續添加y/n");
    char key = myScanner.next( ).charAt(0);
    if( key =='n'){//如果輸入n,就結束
        break;
    }
}while(true);
System.out.println("你退出了添加...");

排序

排序是將一群數據,依指定的順序進行排列的過程。排序的分類:

  1. 內部排序:
    指將需要處理的所有數據都載入到內部存儲器中進行排序。包括(交換式排序法、選擇式排序法和插入式排序法);
  2. 外部排序法:
    數據量過大,無法全部載入到記憶體中,需要藉助外部存儲進行排序。包括(合併排序法和直接合併排序法)。

冒泡排序法

冒泡排序(Bubble Sorting)的基本思想是:通過對待排序序列從後向前(從下標較大的元素開始),依次比較相鄰元素的值,若發現逆序則交換,使值較大的元素逐漸從前移向後部,就象水底下的氣泡一樣逐漸向上冒。

冒泡排序法案例:

下麵我們舉一個具體的案例來說明冒泡法。我們將五個無序:24,69,80,57,13使用冒泡排序法將其排成一個從小到大的有序數列。

總結冒泡排序特點
1.我們一共有5個元素
2.一共進行了4輪排序,可以看成是外層迴圈
3.每1輪排序可以確定一個數的位置,比如第1輪排序確定最大數,第2輪排序,確定第2大的數位置,依次類推
4.當進行比較時,如果前面的數大於後面的數,就交換
5.每輪比較在減少4->3->2->4分析思路-→>代碼..

查找

●介紹:
在java中,我們常用的查找有兩種:
1.順序查找
2.二分查找【二分法,我們放在演算法講解】

●案例演示:
1.有一個數列:白眉鷹王、金毛獅王、紫衫龍王、青翼蝠王猜數游戲:從鍵盤中任意輸入一個名稱,判斷數列中是否包含此名稱【順序查找】要求:如果找到了,就提示找到,並給出下標值。

//定義一個字元串數組
String[] names = {"白眉鷹王","金毛獅王","紫衫龍王","青翼蝠王"};
Scanner myScanner = new Scanner(System.in);
System.out.println("請輸入名字");
String findName = myScanner.next();
//逼曆數組,逐一比較,如果有,則提示信息,並退出//這裡老師給大家一個編程思想
int index = -1;
for(int i = 0; i < names.length; i++){
    //比較字元串比較equals,如果要找到名字就是當前元素
    if(findName.equals(names[i])){
        System.out.println("恭喜你找到"+ findName);
        System.out.println("下標為 " + i); 
        //把i保存到index
        index = i;
        break;//退出
    }
}
if(index == -1){//沒有找到
    System.out.println("sorry ,沒有找到" + findName);
}

2.請對一個有序數組進行二分查找{1,8,10,89,1000,1234},輸入一個數看看該數組是否存在此數,並且求出下標,如果沒有就提示"沒有這個數”。

答案:略

多維數組

多維數組我們只介紹二維數組。

二維數組

●二維數組的應用場景
比如我們開發一個五子棋游戲,棋盤就是需要二維數組來表示。

//1。從定義形式上看int[][]
//2.可以這樣理解,原來的一維數組的每個元素是一維數組,就構成二維數組
int[][ ]arr = { {0,0, 0,0,0,0},
               {0,0,1,0,0,0},
               {0,2,0,3,0,0},
               {0,0,0,0,0,0}};
//輸出二維圖形
for(int i = 0; i < arr.length; i++){
    //逼歷二維數組的每個元秦
    //逼歷二維數組的每個元素(數組)
    //老韓解讀
    //1. arr[i]表示二維數組的第i+1個元秦比如arr[0]∶二維數組的第一個元秦
    //2. arr[i].length得到對應的每個一維數組的長度
    for(int j = 0; j <arr[i].length; j++){
        System.out.print(arr[i][j] + "\t");//輸出了一維數組
    }
    System.out.println();//換行
}

使用方式1:動態初始化

  1. 語法:類型[][] 數組名=new 類型[大小][大小]

  2. 比如: int[][] a[][]=new int[2][3]

  3. 使用演示

  4. 二維數組在記憶體的存在形式

image

使用方式2:動態初始化

  1. 先聲明:類型數組名[][];

  2. 再定義(開闢空間) 數組名=new 類型[大小][大小]

  3. 賦值(有預設值,比如int 類型的就是0)

  4. 使用演示

    int arr[][];//聲明二維數組
    arr = new int[2][3];//再開空間
    

使用方式3:動態初始化-列數不確定

  1. 看一個需求:動態創建下麵二維數組,並輸出。

image

  1. 完成該案例

  2. 畫出執行分析示意圖

    int[][] arr = new int[3][];//創建二維數組,但是只是確定一維數組的個數
    for(int i = 0; i < arr.length; i++){//逼歷arr每個一維數組
        //給每個一維數組開空間new
        //如果沒有給一維數組new,那麼、arr[i]就是null
        arr[i] = new int[i + 1];
        //遍歷一維數組,並給一維數組的每個元素賦值
        for(int j = 0;j < arr[i].length; j++){
            arr[i][j] = i + 1;//賦值
        }
    }
    System.out.println( "=====arr元素=====");//逼歷arr輸出
    for(int i = 0; i < arr.length; i++){
        //輸出arr的每個一維數組
        for(int j = 0; j < arr[i].length; j++){
            System.out.print(arr[i][i]+" ");
        }
        System.out.println();//換行
    }
    

使用方式4:靜態初始化

  1. 定義類型數組名[]={{值1,值2..},{值1,值2..},{值1,值2..}}

  2. 使用即可[固定方式訪問]
    比如:
    int[][] arr = {{1,1,1), {8,8,9}, {100});

解讀

  1. 定義了一個二維數組arr
  2. arr有三個元素(每個元素都是一維數組)
  3. 第一個一維數組有3個元素,第二個一維數組有3個元素,第三個一維數組有1個元素

二維數組使用細節和註意事項

  1. 一維數組的聲明方式有:
    int[] 或者int x[]
  2. 二維數組的聲明方式有:
    int[][]y或者int[] y[]或者int y[][]
  3. 二維數組實際上是由多個一維數組組成的,它的各個一維數組的長度可以相同,也可以不相同。比如:map[[]是一個二維數組
    int map[][] = {{1,2},{3,4,5}}
    由map[0]是一個含有兩個元素的一維數組,map[1]是一個含有三個元素的一維數組構成,我們也稱為列數不等的二維數組。

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

-Advertisement-
Play Games
更多相關文章
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 前言 JS是一門單線程語言,單線程就意味著,所有的任務需要排隊,前一個任務結束,才會執行下一個任務。這樣所導致的問題是:如果JS執行的時間過長,這樣就會造成頁面的渲染不連貫,導致頁面渲染載入阻塞的覺。為瞭解決這個問題,JS中出現了同步和異 ...
  • 一、效果圖 二、代碼實現 註:需要安裝依賴 pnpm i sortablejs -S <template> <div style="padding: 15px"> <h3 style="text-align: left; padding: 10px; background: #ccc"> vue+e ...
  • 1. Text 的絕對居中 Android中顯示時會有預設的padding保留,導致垂直居中會有誤差 //不寫下麵兩個,Android系統上文字會偏下* includeFontPadding: false, textAlignVertical: "center", Text省略號顯示 <Text n ...
  • 2.兩數相加 給你兩個 非空 的鏈表,表示兩個非負的整數。它們每位數字都是按照 逆序 的方式存儲的,並且每個節點只能存儲 一位 數字。 請你將兩個數相加,並以相同形式返回一個表示和的鏈表。 你可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。 示例 1: 輸入:l1 = [2,4,3], l2 ...
  • 編寫代碼中通常會有快速初始化數組的需求,例如我們需要一個類似matlab里的zeros函數,假如這裡我們需要生成一個0-23的數組用於表示一天24小時。 最基本的做法如下: function(){ let hours = []; for(let k = 0; k < 24; k++ )hours.p ...
  • 視頻鏈接:P8~P29 黑馬程式員pink老師前端入門教程,零基礎必看的h5(html5)+css3+移動 參考鏈接: HTML 元素 1.HTML語法規範 1.1 基本語法概述 HTML 標簽是由尖括弧包圍的關鍵詞,例如<html>。 HTML 標簽 通常成對出現,例如 開始標簽 和 結束標簽 , ...
  • 設計模式,設計模式概述,UML,UML類圖,七大原則,程式設計七大原則 ...
  • 函數聲明 int plus_one(int n) { return n + 1; } 函數聲明的語法有以下幾點,需要註意。 返回值類型 函數聲明時,首先需要給出返回值的類型,上例是int,表示函數plus_one()返回一個整數。 參數 函數名後面的圓括弧裡面,需要聲明參數的類型和參數名,plus_ ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...