[轉載] JAVA筆記_(Day04,Day05)函數數組

參考鏈接: 了解Java中的數組IndexOutofbounds異常

文章目錄

?函數定義練習誤區重載(overload)重載選擇題練習函數的內存調用問題

? 數組定義數組的內存圖解數組的常見問題應用求和最大值將數組轉成字符串查表法轉十六進制查表版(十六進制終極版)十進制轉二進制進制轉換(通用版)選擇排序冒泡排序普通查找方式二分查找方式

? ?數組中的數組[][]格式1格式2格式3

? ?數組的練習數組反轉獲取插入點

??

?

?

?

函數?

定義?

函數就是定義在類中的具有特定功能的一段獨立小程序。函數在java中也稱為方法。 格式?

修飾符? 返回值類型 函數名(參數類型 形式參數1,參數類型 形式參數2,…)

{

? ? ? ? 執行語句;

? ? ? ? return 返回值;//return關鍵字是用于結束該功能。并將運算后的具體結果返回給調用者。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //必須有return語句

}

//注意:函數的返回類型如果是void時,return語句可以省略不寫。return;

? ? ? ? ? ? void表示的是沒有返回值的情況。

?

返回值類型:函數運行后的結果的數據類型。 參數類型:是形式參數的數據類型。 形式參數:是一個變量,用于存儲調用函數時傳遞給函數的實際參數。 實際參數:傳遞給形式參數的具體數值。 return:用于結束函數。 返回值:該函數運算后的結果,該結果會返回給調用者。?

舉例:?

public static void main(String[] args) {

? ? ?for(int i=0;i<4;i++) {

? ? ? ? ? ? for(int j=0;j<5;j++) {

? ? ? ? ? ? ? ? System.out.print(j+"*"+i+"="+j*i+"\t" );????????????????

? ? ? ? ? ? }

? ? ? ? ? ? System.out.println();????????????

? ? ? }

}

?

輸出:?

*****

*****

*****

*****

?

問題:要畫矩形,需要不斷使用該for嵌套代碼,造成代碼復用性差。 解決:定義一個功能用于畫矩形,每次只要使用該功能即可。這樣提高復用性。?

如何定義一個功能呢? 1.它應該是一個封閉的區間,就是大括號。 2.它需要有名稱。 3.需要有參與運算的數據 4.需要定義該功能的結果類型。?

在主方法中調用自定義的方法?

public static void main(String[] args) {

? ? ? ? ? ? draw(4,5);????????

? ? }

? ??

static void draw(int row,int col ) {

? ? ? ? ? ? ? ?if(row<0)

? ? ? ? ? ? ? ? ? ? return;//如果row的值<0,直接結束。

? ? ? ? for(int i=0;i<row;i++) {

? ? ? ? ? ? for(int j=0;j<col;j++) {

? ? ? ? ? ? ? ? System.out.print("*");????????????????

? ? ? ? ? ? }

? ? ? ? ? ? System.out.println();????????

? ? ? ? }????????

? ? }

?

總結: 函數就是一個功能。 功能就需要兩個部分: 1.結果;2.未知內容。 明確1:這個功能的結果是什么?其實就是明確返回值類型。 明確2:這個功能需要未知內容是什么?其實就是明確參數列表。?

練習?

需求:需要一個方法,進行加法運算,獲取兩個整數的和。 明確1:功能的結果是什么?是一個和,和是整數。返回值的類型是int。 明確2:功能的未知內容有么?有,加數和被加數。都是int類型,這就是參數列表。?

public static void main(String[] args) {

? ? ? ? int sum=add(4,5);

? ? ? ? System.out.println(sum);

? ? }????

? ? public static int add(int a,int b) {????

? ? ? ? return a+b;

? ? }????

?

誤區?

功能內只定義所需的內容,不需要的不定義。?

重載(overload)?

定義:在同一個類中,允許存在一個以上的同名函數,只要它們的參數個數或者參數類型不同即可。 特點:與返回值類型無關,只看參數列表。 優點:方便于閱讀,優化了程序設計。?

//函數名定義就是為了描述該功能。

?

? ? //兩個整數求和的功能

? ? public static int add(int a,int b) {????

? ? ? ? return a+b;

? ? }

? ? //三個整數求和

? ? public static int add(int a,int b,int c) {????

? ? ? ? return a+b+c;

? ? }

? ? //兩個小數的和

? ? public static double add(double a,double b) {????

? ? ? ? return a+b;

? ? }

?

//九九乘法表的重載

public static void printCFB() {

? ? ? ? for(int i=1;i<=9;i++) {

? ? ? ? ? ? for(int j=1;j<=9;j++) {

? ? ? ? ? ? ? ? System.out.print(j+"*"+i+j*i+"\t");

? ? ? ? ? ? }

? ? ? ? ? ? System.out.println();

? ? ? ? }

? ? }

? ? public static void printCFB(int num) {

? ? ? ? for(int i=1;i<=num;i++) {

? ? ? ? ? ? for(int j=1;j<=num;j++) {

? ? ? ? ? ? ? ? System.out.print(j+"*"+i+j*i+"\t");

? ? ? ? ? ? }

? ? ? ? ? ? System.out.println();

? ? ? ? }

? ? }

?

重載選擇題練習?

只要函數名相同,參數列表不同:順序、個數、類型不同的都算重載。 給定void show(int a,float b,char c){} 下列哪些函數和給定函數重載了。 a.int show(int x,float y,char z){} //沒有重載,這個函數不允許和給定函數存在于同一個類中,因為會產生調用的不確定性。 b.void show(float b,int a,char c){} //重載了,參數列表不同,順序不同 c.void show(int c,float a,char b){} //沒有重載,和給定函數,不允許存在 d.void show(int a,int b,int c){} //重載了,因為類型不同 e.double show(){} //重載了,因為個數不同?

函數的內存調用問題?

舉例:?

public static void main(String[] args) {

? ? ? ? int sum=add(4,5);

? ? ? ? System.out.println(sum);

? ? }????

? ? public static int add(int a,int b) {????

? ? ? ? return a+b;

? ? }????

?

棧:先進棧的后出棧 進棧(壓棧) 出棧(彈棧)?

數組?

定義?

概念:同一種類型數據的集合。其實數組就是一個容器。 優點:數組可以存儲多個數據,可以自動給數組中的元素從0開始編號,方便通過編號(索引)操作這些元素。 數組中的元素默認為0。 格式1:?

//元素類型[] 數組名=new 元素類型[元素個數或數組長度];

//示例如下:

int[] arr=new int[5];//通過new關鍵字創建了一個長度為5,元素類型為int的數組實體

?

格式2:?

//元素類型[] 數組名=new 元素類型[]元素,元素,……];

//示例如下:

int[] arr=new int[]{3,5,1,7};

int[] arr={3,5,1,7};

?

int[] arr= {34,56,78,12,25,46};????

for(int i=0;i<arr.length;i++)//arr.length是數組的長度

? ? ?System.out.println("arr["+i+"]="+arr[i]);

?

數組的內存圖解?

java對內存空間的劃分,分為五部分: 棧、堆、方法區、本地方法區、寄存器。?

棧內存: 存儲的都是局部變量,只要是在方法中定義的變量都是局部變量。 一旦變量的生命周期結束,該變量就被釋放。?

堆內存: 存儲的都是實體(對象)能被new創建的, 每一個實體都有一個首地址值。 堆內存的變量都有默認初始化值。 不同類型不一樣.int:0;double:0.0;boolean:false;char:’\u000’?

堆把首地址告訴棧即可,arr是引用型變量,當不想把arr指向實體時,只要將arr=null; 當實體不再使用時,就會被垃圾回收機制處理。? ??

數組的常見問題?

1.Array Index out of Bounds Exception數組角標溢出異常//訪問到了數組不存在的索引時,會發生該異常。 2.Null Pointer Exception空指針異常//當使用沒有任何實體指向的引用變量操作實體時,運行會發生該異常。?

應用?

數組常見操作 1.獲取最值(最大值,最小值) 2.排序(選擇排序,冒泡排序) 3.折半查找(二分查找)?

求和?

需求:獲取多個數的和的功能。 明確1:結果?int 明確2:參數?多個數,定義多個參數合適嗎?既然是一組數,數組。 步驟: 1.定義變量,記錄和 2.通過循環對數組進行遍歷?

public static void main(String[] args) {

? ? ? ? int[] arr=new int[] {23,44,1,23,56,78};

? ? ? ? add(arr);

? ? ? ? }

? ??

? ? public static int add(int[] arr) {

? ? ? ? int sum=0;

? ? ? ? for(int i=0;i<arr.length;i++) {

? ? ? ? ? ? sum+=arr[i];??????????

? ? ? ? }

? ? ? ? return sum;

? ? }

?

最大值?

需求:獲取多個整數中最大值。 思路: 1.數據多了,為了便于操作,需要容器,用數組。 2.多個數據需要進行比較,每次都有較大的數,需要記錄下來和下一個數比較。 3.將數組中的元素都比一遍。最后,就有了最大值。 步驟: 1.需要數組。 2.定義一個變量記錄住較大的數。 3.對數組進行遍歷,讓元素和較大的值進行比較。 如果元素大于較大的數,用變量記錄該元素。 4.遍歷完成后,變量中記錄就是最大值。 //定義功能。 明確1:結果?最大值。 明確2:參數?int[].?

public static void main(String[] args) {

? ? ? ? int[] arr=new int[] {23,44,1,23,56,78};

? ? ? ? int max=getMax(arr);

? ? ? ? System.out.println("max="+max);

? ? ? ? }

? ??

? ? public static int getMax(int[] arr) {

? ? ? ? int max=arr[0];

? ? ? ? for(int i=1;i<arr.length;i++) {

? ? ? ? ? ? if (max<arr[i])

? ? ? ? ? ? ?max=arr[i];?????????

? ? ? ? }

? ? ? ? return max;

? ? }

?

另一種把public static int getMax(int[] arr){ }中的內容替換為?

public static int getMax_2(int[] arr) {

? ? ? ? int max=0;//初始化為數組中的任意一個角標

? ? ? ? for(int i=1;i<arr.length;i++) {

? ? ? ? ? ? if (arr[max]<arr[i])

? ? ? ? ? ? ?max=i;?????????

? ? ? ? }

? ? ? ? return arr[max];

? ? }

?

將數組轉成字符串?

需求1:定義功能,將[34,12,67]數組中的元素轉成字符串“[34,12,67]” 明確1:結果?字符串。 明確2:參數?數組。 思路:簡單的方式就是利用了字符串和任何數據相加都是相連接。 步驟: 1.定義字符串變量 2.遍歷數組。將每一個數組的元素和字符串相連接。 3.將連接后的字符串返回。?

public static void main(String[] args) {

? ? ? ? int[] arr=new int[] {23,44,1,23,56,78};

? ? ? ? String? str=toString(arr);

? ? ? ? System.out.println("string="+str);

? ? ? ? }

? ??

? ? public static String toString(int[] arr) {

? ? ? ? String temp="[";//初始化為[字符串

? ? ? ? for(int i=0;i<arr.length;i++) {??????????

? ? ? ? ? ? if (i!=arr.length-1)

? ? ? ? ? ? ? ? temp=temp+arr[i]+",";

? ? ? ? ? ? else?

? ? ? ? ? ? ? ? temp=temp+arr[i]+"]";? ?????????????

? ? ? ? }

? ? ? ? return temp;

? ? }

?

結果:?

string=[23,44,1,23,56,78]

?

查表法?

數組使用的核心思想: 容器特點:1.固定長度;2.元素都有索引。 什么時候使用容器呢?數據多了,必須先進行存儲,然后進行操作。 對于數組容器什么時候用呢?數據多,個數確定,而且有對應關系。 在分析需求時: 1.需求中的數據是否有對應的有序編號? 2.需求中的數據是否需要有序的編號。 如果有,就用數據存儲。 例1:一組數:34 89 12 78 45 要對他們進行操作。需要編號,操作更容易。 例2:根據用戶輸入的數據,顯示對應的星期。 思路: 1.星期有多個,個數固定。 2.星期對應的有序編號,有序的編號就可以作為索引。 所以可以使用數組這種結構進行存儲。 需求: 定義一個功能,根據給定的數據獲取對應的星期。 查表法:數據之間存在對應關系,通過關系中一方查詢另一方。 當對應關系存在,但沒有一方是有序編號時,使用另一個容器map。 步驟: 1.定義一個數組,存儲固定的星期數。這個稱之為一個存儲了對應關系的表。?

public static void main(String[] args) {

? ? ? ? int num=7;

? ? ? ? String? week=getWeek(num);

? ? ? ? System.out.println(num+"對應的星期為"+week);

? ? ? ? }

? ??

? ? public static String getWeek(int num) {

? ? ? ? String[] weeks = new String[]{"","星期一","星期二","星期三","星期四","星期五","星期六","星期日"};//其實就是根據制定的索引在查表? ?

? ? ? ? if (num>7||num<1)

? ? ? ? ? ? return num+"沒有對應的星期";//throw new RuntimeException("沒有對應的星期");拋出異常,return結束當前功能,拋出異常是結束當前程序

? ? ? ? else? ? ? ? ? ??????

? ? ? ? ? ? return weeks[num];? ?????

? ? }

?

轉十六進制?

需求:十進制—>十六進制 &15 >>>4 循環 原本:?

public static void main(String[] args) {

? ? ? ? int num=60;

? ? ? ? for(int i=0;i<8;i++) {//4個8位

? ? ? ? ? ? int temp=num&15;

? ? ? ? ? ? if (temp>9)

? ? ? ? ? ? ? ? System.out.println((char)(temp-10+'A'));

? ? ? ? ? ? else

? ? ? ? ? ? ? ? System.out.println(temp);

? ? ? ? ? ? num=num>>>4;????????????

? ? ? ? }

? ? }

?

解決問題: 1.順序反了。2.去除多余的0. 解決方式: 1.每運算出一位,不要打印,先存儲,需要容器。 2.去除零?需要轉換的數據會不斷地右移,如果右移后剩余的二進制都是0,也就是沒有有效位,就不需要進行&運算了。也就是不需要再往數組中存儲了。?

public static void main(String[] args) {

? ? ? ? int num=60;

? ? ? ? String str_hex=toHex(num);

? ? ? ? System.out.println(str_hex);

? ? }

? ??

? ? public static String toHex(int num) {? ??????

? ? ? ? //1.定義容器,存儲的是字符,長度位8,一個整數最多8個16進制位。

? ? ? ? char[] chas=new char[8];

? ? ? ? //2.定義一個用于操作數組的索引。

? ? ? ? //int index=chas.length-1;

? ? ? ? ? int index=chas.length;

? ? ? ? //for(int i=0;num!=0&&i<8;i++) {

? ? ? ? //for(;num!=0;) {

? ? ? ? while(num!=0) {

? ? ? ? ? ? int temp=num&15;

? ? ? ? ? ? if (temp>9)

? ? ? ? //? ? ? ? chas[index]=((char)(temp-10+'A'));

? ? ? ? ? ? ? ? chas[--index]=((char)(temp-10+'A'));

? ? ? ? ? ? else

? ? ? ? //? ? ? ? chas[--index]=((char)(temp+'0'));

? ? ? ? ? ? ? ? chas[--index]=((char)(temp+'0'));

? ? ? ? ? ? //3.讓角標自增。

? ? ? ? //? ? index--;

? ? ? ? ? ? num=num>>>4;????????????????

? ? ? ? }

? ? ? ? /*

? ? ? ? // 4.遍歷數組。

? ? ? ? for(int i=0;i<chas.length;i++) {

? ? ? ? ? ? System.out.print(chas[i]+",");? ?????????

? ? ? ? }

? ? ? ? */

? ? ? ? System.out.println("index="+index);

? ? ? ? return "0x"+toString(chas,index);

? ? }

? ? ? ? ? ?//定義一個功能,將字符數組轉成字符串

? ? ? ? public static String toString(char[] arr,int index){

? ? ? ? String temp="";

? ? ? ? for(int i=index;i<arr.length;i++) {

? ? ? ? ? ? temp=temp+arr[i];? ??????????

? ? ? ? }

? ? ? ? return temp;

? ? }

?

查表版(十六進制終極版)?

思路: 十進制轉成十六進制的每一位都是十六進制元素中的某一個。 十六進制中的元素有很多固定個數,而且還有對應的編號。 所以可以使用傳說中的查表法。?

? ? public static void main(String[] args) {

? ? ? ? int num=60;

? ? ? ? String str_hex=toHex(num);

? ? ? ? System.out.println(str_hex);

? ? }

? ??

? ? public static String toHex(int num) {? ??????

? ? ? ? //1.建立表。

? ? ? ? char[] chs= {'0','1','2','3',

? ? ? ? ? ? ? ? ? ? ?'4','5','6','7',

? ? ? ? ? ? ? ? ? ? ?'8','9','A','B',

? ? ? ? ? ? ? ? ? ? ?'C','D','E','F'};

? ??????

? ? ? ? //2.創建臨時容器。

? ? ? ? char[] arr=new char[8];

? ??????

? ? ? ? //創建操作臨時容器的索引。

? ? ? ? int index=arr.length;

? ??????

? ? ? ? //4.通過循環對num進行& >>>等運算

? ? ? ? while(num!=0) {

? ? ? ? ? ? //5.對num進行&運算。

? ? ? ? ? ? int temp=num&15;

? ??????????

? ? ? ? ? ? //根據&運算后的結果作為角標查表,獲取對應字符,并將字符存儲放到臨時容器中。

? ? ? ? ? ? arr[--index]=chs[temp];

? ??????????

? ? ? ? ? ? //7.對num進行右移。

? ? ? ? ? ? num=num>>>4;? ?????????

? ? ? ? }

? ? ? ? return "0x"+toString(arr,index);? ? ? ?????

? ? }

? ? ? ? public static String toString(char[] arr,int index){

? ? ? ? ? ?String temp="";

? ? ? ? ? ?for(int i=index;i<arr.length;i++) {

? ? ? ? ? ? ? temp=temp+arr[i];? ??????????

? ? ? ? ? ?}

? ? ? ? ? ? return temp;

? ? ? ? ?}

?

十進制轉二進制?

public static void main(String[] args) {

? ? ? ? int num=60;

? ? ? ? String binary=toBina(num);

? ? ? ? System.out.println(hex);

? ? }

? ? //將輸出的數字存儲在數組中,返回類型為char,輸入的參數列表為int

? ? public static String toBina(int num) {

? ? ? ? //查表

? ? ? ? char[] binary= {'0','1'};

? ? ? ? //建立新的存儲容器

? ? ? ? char[] arr=new char[32];

? ? ? ? //建立索引

? ? ? ? int index=arr.length;

? ? ? ? while(num!=0) {

? ? ? ? ? ? int temp=num&1;

? ? ? ? ? ? arr[--index]=hex[temp];

? ??????????

? ? ? ? ? ? num=num>>>1;

? ? ? ? }

? ? ? ? return toString(arr,index);

? ? }

? ? public static String toString(char[] arr,int index) {

? ? ? ? String temp="";

? ? ? ? for(int i=index;i<arr.length;i++) {

? ? ? ? ? ? temp=temp+arr[i];

? ? ? ? }??

? ? ? ? return temp;

? ? }

?

進制轉換(通用版)?

public static void main(String[] args) {

? ? ? ? int num=60;

? ? ? ? String str_hex=toHex(num);

? ? ? ? String str_binary=toBinary(num);

? ? ? ? String str_oct=toOctal(num);

? ? ? ? System.out.println(num+"的十六進制為"+str_hex);

? ? ? ? System.out.println(num+"的二進制為"+str_binary);

? ? ? ? System.out.println(num+"的八進制為"+str_oct);

? ? }

? ? //十進制-->十六進制

? ? public static String toHex(int num) {

? ? ? ? return "0x"+trans(num,15,4);

? ? }

? ??

? ? //十進制-->二進制

? ? public static String toBinary(int num) {

? ? ? ? return trans(num,1,1);

? ? }

? ??

? ??

? ? //十進制-->八進制

? ? public static String toOctal(int num) {

? ? ? ? return "0"+trans(num,7,3);

? ? }

? ??

? ??

? ? //用于進制轉換

? ? public static String trans(int num,int base,int offset) {? ??????

? ? ? ? //1.建立表。

? ? ? ? char[] chs= {'0','1','2','3',

? ? ? ? ? ? ? ? ? ? ?'4','5','6','7',

? ? ? ? ? ? ? ? ? ? ?'8','9','A','B',

? ? ? ? ? ? ? ? ? ? ?'C','D','E','F'};

? ??????

? ? ? ? //2.創建臨時容器。

? ? ? ? char[] arr=new char[32];

? ??????

? ? ? ? //創建操作臨時容器的索引。

? ? ? ? int index=arr.length;

? ??????

? ? ? ? //4.通過循環對num進行& >>>等運算

? ? ? ? while(num!=0) {

? ? ? ? ? ? //5.對num進行&運算。

? ? ? ? ? ? int temp=num&base;

? ??????????

? ? ? ? ? ? //根據&運算后的結果作為角標查表,獲取對應字符,并將字符存儲放到臨時容器中。

? ? ? ? ? ? arr[--index]=chs[temp];

? ??????????

? ? ? ? ? ? //7.對num進行右移。

? ? ? ? ? ? num=num>>>offset; //偏移量??????????

? ? ? ? }

? ? ? ? return toString(arr,index);? ? ? ?????

? ? }

? ? ? ? public static String toString(char[] arr,int index){

? ? ? ? ? ?String temp="";

? ? ? ? ? ?for(int i=index;i<arr.length;i++) {

? ? ? ? ? ? ? temp=temp+arr[i];? ??????????

? ? ? ? ? ?}

? ? ? ? ? ? return temp;

? ? ? ? ?}

?

總結:java有一種幫助文檔,里面封裝了很多函數。 包括進制轉換:?

//java已提供的功能

System.out.println(Integer.toBinaryString(28));

System.out.println(Integer.toOctalString(28));

System.out.println(Integer.toHexString(28));

?

選擇排序?

數組的排序 選擇排序(Selection sort)是一種簡單直觀的排序算法。它的工作原理是每一次從待排序的數據元素中選出最小(或最大)的一個元素,存放在序列的起始位置,然后,再從剩余未排序元素中繼續尋找最小(大)元素,然后放到已排序序列的末尾。以此類推,直到全部待排序的數據元素排完。 選擇排序是不穩定的排序方法。 外循環:不同起點 內循環:同起點的不同箭頭 確定頭(最小)??

public static void main(String[] args) {

? ? ? ? int[] arr=new int[] {12,9,23,77,6,34};

? ? ? ? printArray(arr);

? ? ? ? selectSort(arr);

? ? ? ? printArray(arr);????????

? ? ? ? }

? ??

? ? //打印數組的方法

? ? public static void printArray(int[] arr) {????????

? ? ? ? for(int i=0;i<arr.length;i++) {

? ? ? ? ? ? if(i!=arr.length-1)

? ? ? ? ? ? ? ?System.out.print (arr[i]+",");

? ? ? ? ? ? else

? ? ? ? ? ? ? ?System.out.println (arr[i]);

? ? ? ? }

? ? }

? ? //數組的排序,選擇排序

? ? public static void selectSort(int[] arr) {

? ? ? ? for(int i=0;i<arr.length-1;i++) {

? ? ? ? ? ? for(int j=i+1;j<arr.length;j++) {

? ? ? ? ? ? ? ? if(arr[i]>arr[j]) {

? ? ? ? ? ? ? ? ? ? int temp=arr[i];

? ? ? ? ? ? ? ? ? ? arr[i]=arr[j];

? ? ? ? ? ? ? ? ? ? arr[j]=temp;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? }

? ??????

? ? }

?

冒泡排序?

確定尾(最大)??

public static void main(String[] args) {

? ? ? ? int[] arr=new int[] {12,9,23,77,6,34};

? ? ? ? printArray(arr);

? ? ? ? bubbleSort(arr);

? ? ? ? printArray(arr);????????

? ? ? ? }

? ??

? ? //打印數組的方法

? ? public static void printArray(int[] arr) {????????

? ? ? ? for(int i=0;i<arr.length;i++) {

? ? ? ? ? ? if(i!=arr.length-1)

? ? ? ? ? ? ? ?System.out.print (arr[i]+",");

? ? ? ? ? ? else

? ? ? ? ? ? ? ?System.out.println (arr[i]);

? ? ? ? }

? ? }

? ? //數組的排序,冒泡排序

? ? public static void bubbleSort(int[] arr) {

? ? ? ? for(int i=0;i<arr.length-1;i++) {

? ? ? ? ? ? for(int j=0;j<arr.length-1-i;j++) {

? ? ? ? ? ? ? ? if(arr[j]>arr[j+1]) {

? ? ? ? ? ? ? ? ? ? int temp=arr[j];

? ? ? ? ? ? ? ? ? ? arr[j]=arr[j+1];

? ? ? ? ? ? ? ? ? ? arr[j+1]=temp;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? }????????

? ? }

?

java中也有直接的包?

import java.util.Arrays;

public class Myclass1 {

?

? ? public static void main(String[] args) {

? ? ? ? int[] arr=new int[] {12,9,23,77,6,34};

? ? ? ? printArray(arr);

? ? ? ? ? ?Arrays.sort(arr);//開發時用該調優。

? ? ? ? ? ?printArray(arr);????????

? ? ? ? }????

? ? //打印數組的方法

? ? public static void printArray(int[] arr) {????????

? ? ? ? for(int i=0;i<arr.length;i++) {

? ? ? ? ? ? if(i!=arr.length-1)

? ? ? ? ? ? ? ?System.out.print (arr[i]+",");

? ? ? ? ? ? else

? ? ? ? ? ? ? ?System.out.println (arr[i]);

? ? ? ? }

? ? }

?

發現排序方法,位置置換代碼重復,進行抽取。?

? ? public static void main(String[] args) {

? ? ? ? int[] arr=new int[] {12,9,23,77,6,34};

? ? ? ? printArray(arr);

? ? ? ? selectSort(arr);

? ? ? ? //Arrays.sort(arr);

? ? ? ? printArray(arr);????

? ? ? ? bubbleSort(arr);

? ? ? ? //Arrays.sort(arr);

? ? ? ? printArray(arr);? ? ? ? ? ??

? ? ? ? }

? ??

? ? //打印數組的方法

? ? public static void printArray(int[] arr) {????????

? ? ? ? for(int i=0;i<arr.length;i++) {

? ? ? ? ? ? if(i!=arr.length-1)

? ? ? ? ? ? ? ?System.out.print (arr[i]+",");

? ? ? ? ? ? else

? ? ? ? ? ? ? ?System.out.println (arr[i]);

? ? ? ? }

? ? }

? ? //數組的排序,選擇排序

? ? ? ? public static void selectSort(int[] arr) {

? ? ? ? ? ? for(int i=0;i<arr.length-1;i++) {

? ? ? ? ? ? ? ? for(int j=i+1;j<arr.length;j++) {

? ? ? ? ? ? ? ? ? ? if(arr[i]>arr[j]) {

? ? ? ? ? ? ? ? ? ? ? ? swap(arr,i,j);

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? }

? ? //數組的排序,冒泡排序

? ? public static void bubbleSort(int[] arr) {

? ? ? ? for(int i=0;i<arr.length-1;i++) {

? ? ? ? ? ? for(int j=0;j<arr.length-1-i;j++) {

? ? ? ? ? ? ? ? if(arr[j]>arr[j+1]) {

? ? ? ? ? ? ? ? ? ? swap(arr,j,j+1);

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? }

? ??????

? ? }

? ? public static? void swap(int[] arr,int a,int b) {//角標要先有數組

? ? ? ? int temp=arr[a];

? ? ? ? arr[a]=arr[b];

? ? ? ? arr[b]=temp;????????

? ? }

?

普通查找方式?

需求:查找一個元素在數組中的第一次出現的位置。?

public static void main(String[] args) {

? ? ? ? int[] arr=new int[] {12,9,23,77,6,34};

? ? ? ? int x=searchKey(arr,77);

? ? ? ? System.out.println(x);

? ? ? ? }

? ??

? ? //打印數組的方法

? ? public static int searchKey(int[] arr,int key) {????????

? ? ? ? //遍歷查找

? ? ? ? for(int i=0;i<arr.length;i++) {

? ? ? ? ? ? if(arr[i]==key)

? ? ? ? ? ? ? ? return i;

? ? ? ? }

? ? ? ? //數組中不存在的角標,為-1

? ? ? ? return -1;//代表角標不存在的情況

? ? }

?

二分查找方式?

前提:數組必須是有序(遞增或遞減)的。??

思路: 1.通過角標先獲取中間角標上元素。 2.讓該元素和要找的數據比較。 3.如果要找的數大了,縮小范圍,要找的范圍應該是 中間的角標+1-----尾角標。 4.如果要找的小了,縮小范圍,要找的范圍應該是 頭角標-----中間的角標+1。 5.不斷如此重復,就可以找到元素對應的角標。?

public static void main(String[] args) {

? ? ? ? int[] arr=new int[] {9,12,15,24,36,41,59,68};

? ? ? ? int index=binarySearch(arr,41);

? ? ? ? System.out.println("index="+index);

? ? ? ? }

? ? public static int binarySearch(int[] arr,int key) {????????

? ? ? ? //1.定義三個變量,記錄頭角標、尾角標、中間角標

? ? ? ? int min,max,mid;

? ? ? ? min=0;

? ? ? ? max=arr.length-1;

? ? ? ? mid=(min+max)>>1;

? ? ? ? ? ? while(arr[mid]!=key) {

? ? ? ? ? ? ? ? if(arr[mid]>key)

? ? ? ? ? ? ? ? ? ? max=mid-1;

? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? ? min=mid+1;

? ? ? ? ? ? ? ? ? //判斷元素是否存在

? ? ? ? ? ? ? ? if (max<min)

? ? ? ? ? ? ? ? ? ? return -1;

? ? ? ? ? ? ? ? mid=(min+max)>>1;

? ? ? ? ? ? }

? ? ? ? ? ? ? ? return mid;????????????

? ? ? ? }

?

還有一種是把 public static int binarySearch(int[] arr,int key) { }中的內容換成?

public static int binarySearch(int[] arr,int key) {

? ? ? ? //1.定義三個變量,記錄頭角標、尾角標、中間角標

? ? ? ? ? ? ? ? int min,max,mid;

? ? ? ? ? ? ? ? min=0;

? ? ? ? ? ? ? ? max=arr.length-1;

? ? ? ? ? ? ? ? while(min<=max) {

? ? ? ? ? ? ? ? ? ? mid=(min+max)>>1;

? ? ? ? ? ? ? ? ? ? if(key<arr[mid])

? ? ? ? ? ? ? ? ? ? ? ? max=mid-1;

? ? ? ? ? ? ? ? ? ? else if(key>arr[mid])

? ? ? ? ? ? ? ? ? ? min=mid+1;

? ? ? ? ? ? ? ? ? ? else

? ? ? ? ? ? ? ? ? ? ? ? return mid;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? return -1;

?

數組中的數組[][]?

開發時并不常用 比如說俄羅斯方塊的坐標點?

格式1?

int[][] arr=new int[3][2];

?

定義了名稱為arr的二維數組; 二維數組中有3個一維數組; 每一個一維數組中有2個元素; 一維數組的名稱分別為arr[0],arr[1],arr[2]; 給第一個一維數組1腳標位賦值為78寫法為:arr[0][1]=78。 二維數組分布情況:??

int[][] arr=new int[3][2];

System.out.println(arr);

//輸出為[[I@15db9742//二位數組實體。//@右邊為哈希值,實體在內存中存放的位置;@左邊[是數組,[[是而二維數組,I是類型int.

System.out.println(arr[0]);//輸出為[I@6d06d69c//一維數組實體。

System.out.println(arr[0][0]);//一維數組中的元素。

?

格式2?

int[][] arr=int[3][];

?

二維數組中有3個一維數組; 每個一維數組都是默認初始值null; 可以對這個三個一維數組分別進行初始化 arr[0]=new int[3]; arr[1]=new int[1]; arr[2]=new int[2]; 二維數組分布情況:? 定義一維數組后的分布:??

int[][] array=new int[3][];//明確了二維數組的長度,沒有明確具體的一維數組。

System.out.println(array);//輸出為[[I@15db9742

System.out.println(array[0]);//null

System.out.println(array[0][0]);//NullPointerException空指針

?

格式3?

int[][] arr= {{23,17,11},{88,11,33,90},{11,78,34}};

? ? ? ? //求和

? ? ? ? int sum=0;

? ? ? ? for(int i=0;i<arr.length;i++) {//遍歷二維數組

? ? ? ? ? ? for(int j=0;j<arr[i].length;j++)

? ??????????

? ? ? ? ? ? sum+=arr[i][j];????????????

? ? ? ? }????????

? ? ? ? System.out.println(sum);

?

數組的練習?

數組反轉?

需求:對一個給定的數組進行反轉。 [23,14,88,5]–> [5,88,14,23]?

? public static void main(String[] args) {

? ? ? ? int[]arr= new int[] {23,14,88,5};

? ? ? ? reverse(arr);????

? ? ? ? }

? ? public static void reverse(int[] arr) {

? ? ? ? for(int start=0,end=arr.length-1;start<end;start++,end--) {

? ? ? ? ? ? swap(arr,start,end);

? ??????????

? ? ? ? }? ?????

? ? }

? ? public static void swap(int[] arr,int a,int b) {

? ? ? ? int temp=arr[a];

? ? ? ? arr[a]=arr[b];

? ? ? ? arr[b]=temp;

? ? }

?

獲取插入點?

需求:如果往有序的數組中插入一個元素并繼續保持有序,問如何獲取該位置? 思路: 1.既然是有序的數組,而且是找位置,必須要想到二分查找法。?

public static void main(String[] args) {

? ??????

? ? ? ? int[]arr= new int[] {9,13,17,22,31,46,58,77};

? ? ? ? int index=binarySearch(arr,7);? ? ? ??

? ? ? ? System.out.println("index="+index);

? ? ? ? }

? ? ? ??

? ? public static int binarySearch(int[] arr,int key) {

? ? ? ? int min,max,mid;

? ? ? ? min=0;

? ? ? ? max=arr.length-1;

? ? ? ? while(min<=max) {

? ? ? ? ? ? mid=(min+max)>>1;

? ? ? ? ? ? if(key<arr[mid])

? ? ? ? ? ? ? ? max=mid-1;

? ? ? ? ? ? else if(key>arr[mid])

? ? ? ? ? ? ? ? min=mid+1;

? ? ? ? ? ? else?

? ? ? ? ? ? ? ? return mid;? ? ??????

? ? ? ? }

? ? ? ? ? ? return min;

? ? ? ? }? ?????

?

或者直接用java里的封裝函數?

import java.util.Arrays;

public class Myclass1 {

public static void main(String[] args) {

? ??????

? ? ? ? int[]arr= new int[] {9,13,17,22,31,46,58,77};

? ? ? ? int index=binarySearch(arr,7);? ? ? ??

? ? ? ? System.out.println("index1="+index);

? ? ? ? int index2=Arrays.binarySearch(arr,7);? ? ? ??

? ? ? ? System.out.println("index2="+index2);

? ? ? ? }

? ? ? ??

? ? public static int binarySearch(int[] arr,int key) {

? ? ? ? int min,max,mid;

? ? ? ? min=0;

? ? ? ? max=arr.length-1;

? ? ? ? while(min<=max) {

? ? ? ? ? ? mid=(min+max)>>1;

? ? ? ? ? ? if(key<arr[mid])

? ? ? ? ? ? ? ? max=mid-1;

? ? ? ? ? ? else if(key>arr[mid])

? ? ? ? ? ? ? ? min=mid+1;

? ? ? ? ? ? else?

? ? ? ? ? ? ? ? return mid;? ? ??????

? ? ? ? }

? ? ? ? ? ? return -(min+1);//如果該數不存在,用負數告訴該值不存在且插入值在哪里。還可以避免-0.

? ? ? ? }? ?????

? }

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/540173.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/540173.shtml
英文地址,請注明出處:http://en.pswp.cn/news/540173.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

VDI序曲二 RemotoAPP部署

首先&#xff0c;我們需要準備如下角色&#xff1a;沿用VDI序曲一的2臺物理服務器以及角色我們在物理服務器1的hyper-v上&#xff0c;我們利用之前我介紹的“服務器虛擬化之準備母盤VHD”的方法再創建如下虛擬機&#xff1a;WIN-RDAPP&#xff1b;WIN-RDWA&#xff1b;WIN-RDCB…

[轉載] Java ArrayList toArray(T[] a) 解惑

參考鏈接&#xff1a; Java中的Array vs ArrayList 先看一個小的代碼片段 ArrayList<Integer> arrayList new ArrayList<>(); Collections.addAll(arrayList, 11, 21, 31, 41, 51); Integer[] a new Integer[0]; Integer[] b new Integer[arrayList.size()]; …

CentOS7使用firewalld打開關閉防火墻與端口(轉載)

1、firewalld的基本使用 啟動&#xff1a; systemctl start firewalld 查看狀態&#xff1a; systemctl status firewalld 停止&#xff1a; systemctl disable firewalld 禁用&#xff1a; systemctl stop firewalld 2.systemctl是CentOS7的服務管理工具中主要的工具&#xff…

多任務管理類 MutilTaskManager

計算和計算所需的數據能被較為平均的非配到若干task的時候&#xff0c;下面的任務管理類可以提供在大數據大計算量的情況下非精確的控制task的執行數量來限制計算量和內存占用量.下面是代碼&#xff08;非線程安全版本&#xff09;&#xff1a; public class MutilTaskManager{…

[轉載] Scanner和bufferreader讀取控制臺字符的區別

參考鏈接&#xff1a; Java中Scanner和BufferReader類之間的區別 從開始學習Java就用了scanner&#xff0c;因為比較簡單每當遇到空格鍵或者換行鍵則讀取下一個字符&#xff0c;一般用法 while(input.hasNextInt()){ int n input.nextInt(); int t input.nextInt(); int c …

Node.js meitulu圖片批量下載爬蟲1.051

原有1.05版程序沒有斷點續傳模式&#xff0c;現在在最近程序基礎上改寫一版1.051. // // meitulu圖片批量下載爬蟲1.051 // 用最近的斷點續傳框架改寫原有1.05版程序 // 2017年11月21日 //// 內置https模塊 var httpsrequire("https");// 內置http模塊 var httprequi…

[轉載] Java實現歸并排序(超詳細,新手請進)

參考鏈接&#xff1a; Java中將數組合并為的新數組 歸并排序 大家好&#xff0c;這是我第一次在CSDN上寫東西&#xff0c;因為我一直覺得有需要就去找別人的blog看看就好&#xff0c;但我發現自己寫出來的東西確實能加深記憶。我半路出家&#xff0c;屬實是個菜鳥&#xff0…

centos6設置靜態IP

#編輯配置文件,添加修改以下內容 vim /etc/sysconfig/network-scripts/ifcfg-eth0 BOOTPROTOstatic #啟用靜態IP地址 ONBOOTyes #開啟開機自動啟用網絡連接 IPADDR192.168.21.129 #設置IP地址 NETMASK255.255.255.0 #設置子網掩碼 GATEWAY192.168…

[轉載] 1022 D進制的A+B (20分)【java題解】【80ms】

參考鏈接&#xff1a; Java流Stream 題解 使用 toUnsignedString&#xff08;&#xff09;即可 我有仔細讀過toUnsignedString&#xff08;&#xff09;&#xff0c;有興趣可以看看 第3章 java的基本程序設計結構【補缺學習】【注釋與數據類型】【核心技術卷I】 impor…

mysql 5.6.4以上版本innodb支持全文索引的測試

對于mysql 5.6.4以上版本innodb支持全文索引的測試 在mysql官網&#xff0c;innodb引擎在5.6.4版本提供了對全文索引的支持&#xff0c;筆者對此做了測試&#xff0c;發現對中文全文檢索的支持依然不理想&#xff0c;但卻確實提供了對英文的全文支持。 12.9.5 Full-Text Restri…

[轉載] Java字符串分割方法

參考鏈接&#xff1a; Java中的StringTokenizer方法的示例 2 [sizemedium]1.用split()方法進行分割&#xff0c;分割開的子字符串放入數組&#xff0c;然后進行處理。 示例代碼如下&#xff1a; public class SplitTest { /** * param args * author colin */ …

[轉載] Java StringBuilder StringJoiner

參考鏈接&#xff1a; 何時在StringBuilder上使用StringJoiner 1. StringBuilder Java編譯器對String做了特殊處理&#xff0c;使得我們可以直接用拼接字符串。 雖然可以直接拼接字符串&#xff0c;但是&#xff0c;在循環中&#xff0c;每次循環都會創建新的字符串對象&a…

EMC VMAX的磁盤構成,fast policy(重要)

首先是流程&#xff0c; 不同種類的磁盤&#xff08;sata&#xff0c;fc&#xff0c;flah&#xff09;->disk group->raid->DATA volume->thin pool->TDEV and BCVDEV (lun) 然后細看&#xff1a; 1&#xff09; 不同種類的磁盤叫做disk&#xff0c;這是可見的物…

[轉載] Java反射是什么?看這篇絕對會了!

參考鏈接&#xff1a; Java中的util.Arrays與Reflection.Array的示例 作者&#xff1a;火星十一郎 https://www.cnblogs.com/hxsyl 一.概念 反射就是把Java的各種成分映射成相應的Java類。 Class類的構造方法是private&#xff0c;由JVM創建。 反射是java語言的一個特性…

[精講-3]Offline Domain Join

從windows 2008 ,windows 7開始起就具備脫機加入域的功能,就是它們在未連接DC的情況下,也可以加入域. 假如環境lab.com ,一臺已加入域的PC (WIN7Client) 和即將加入域的PC(win7-2) 在win7client上run下面這個命令 DC已作了一次預先的動作:創建了computer object 在win7-2上,用本…

[轉載] Java——toArray,集合轉換為數組

參考鏈接&#xff1a; 從ArrayList到Java的Array數組轉換&#xff1a;toArray()方法 package day04; import java.util.ArrayList; import java.util.Collection; /** * 集合轉換為數組 * Collection中定義了兩個方法 * Object[] toArray * <T>Y[] toArray(T[] array) …

c#匿名方法

//以下示例和說明都源于《visual c# 2005 技術內幕》 //匿名函數就是沒有名字的函數&#xff0c;是專用于委托的函數。 using System; using System.Collections.Generic; using System.Text; namespace 匿名方法 { public delegate void DelegateClass(); public dele…

[轉載] JAVA8 創建流的5種方式

參考鏈接&#xff1a; 用Java創建流的10種方法 java8中的流式操作是一個很重要的內容 1、通過 stream 方法把 List 或數組轉換為流&#xff0c;如Arr.stream()&#xff1b; //通過stream方法把List或數組轉換為流 Arrays.asList("a1", "a2", "a3&…

用戶反饋:對 Rafy 開發框架的一些個人建議

對Rafy開發框架的一些個人建議 1、潛在使用群體分析 個人認為使用類似Rafy、AgileEAS.NET、PDF.NET及OpenWorks框架的群體主要為以下幾種&#xff1a; 1.1、小微軟件企業 小微軟件企業&#xff0c;這類軟件公司的開發人員一般在10人以下&#xff0c;多以項目實施為主基本談不上…