[转载] JAVA笔记_(Day04,Day05)函数数组
參考鏈接: 了解Java中的數(shù)組IndexOutofbounds異常
文章目錄
?函數(shù)定義練習(xí)誤區(qū)重載(overload)重載選擇題練習(xí)函數(shù)的內(nèi)存調(diào)用問題
? 數(shù)組定義數(shù)組的內(nèi)存圖解數(shù)組的常見問題應(yīng)用求和最大值將數(shù)組轉(zhuǎn)成字符串查表法轉(zhuǎn)十六進(jìn)制查表版(十六進(jìn)制終極版)十進(jìn)制轉(zhuǎn)二進(jìn)制進(jìn)制轉(zhuǎn)換(通用版)選擇排序冒泡排序普通查找方式二分查找方式
? ?數(shù)組中的數(shù)組[][]格式1格式2格式3
? ?數(shù)組的練習(xí)數(shù)組反轉(zhuǎn)獲取插入點(diǎn)
??
?
?
?
函數(shù)?
定義?
函數(shù)就是定義在類中的具有特定功能的一段獨(dú)立小程序。函數(shù)在java中也稱為方法。 格式?
修飾符? 返回值類型 函數(shù)名(參數(shù)類型 形式參數(shù)1,參數(shù)類型 形式參數(shù)2,…)
{
? ? ? ? 執(zhí)行語句;
? ? ? ? return 返回值;//return關(guān)鍵字是用于結(jié)束該功能。并將運(yùn)算后的具體結(jié)果返回給調(diào)用者。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //必須有return語句
}
//注意:函數(shù)的返回類型如果是void時(shí),return語句可以省略不寫。return;
? ? ? ? ? ? void表示的是沒有返回值的情況。
?
返回值類型:函數(shù)運(yùn)行后的結(jié)果的數(shù)據(jù)類型。 參數(shù)類型:是形式參數(shù)的數(shù)據(jù)類型。 形式參數(shù):是一個(gè)變量,用于存儲(chǔ)調(diào)用函數(shù)時(shí)傳遞給函數(shù)的實(shí)際參數(shù)。 實(shí)際參數(shù):傳遞給形式參數(shù)的具體數(shù)值。 return:用于結(jié)束函數(shù)。 返回值:該函數(shù)運(yùn)算后的結(jié)果,該結(jié)果會(huì)返回給調(diào)用者。?
舉例:?
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嵌套代碼,造成代碼復(fù)用性差。 解決:定義一個(gè)功能用于畫矩形,每次只要使用該功能即可。這樣提高復(fù)用性。?
如何定義一個(gè)功能呢? 1.它應(yīng)該是一個(gè)封閉的區(qū)間,就是大括號(hào)。 2.它需要有名稱。 3.需要有參與運(yùn)算的數(shù)據(jù) 4.需要定義該功能的結(jié)果類型。?
在主方法中調(diào)用自定義的方法?
public static void main(String[] args) {
? ? ? ? ? ? draw(4,5);????????
? ? }
? ??
static void draw(int row,int col ) {
? ? ? ? ? ? ? ?if(row<0)
? ? ? ? ? ? ? ? ? ? return;//如果row的值<0,直接結(jié)束。
? ? ? ? for(int i=0;i<row;i++) {
? ? ? ? ? ? for(int j=0;j<col;j++) {
? ? ? ? ? ? ? ? System.out.print("*");????????????????
? ? ? ? ? ? }
? ? ? ? ? ? System.out.println();????????
? ? ? ? }????????
? ? }
?
總結(jié): 函數(shù)就是一個(gè)功能。 功能就需要兩個(gè)部分: 1.結(jié)果;2.未知內(nèi)容。 明確1:這個(gè)功能的結(jié)果是什么?其實(shí)就是明確返回值類型。 明確2:這個(gè)功能需要未知內(nèi)容是什么?其實(shí)就是明確參數(shù)列表。?
練習(xí)?
需求:需要一個(gè)方法,進(jìn)行加法運(yùn)算,獲取兩個(gè)整數(shù)的和。 明確1:功能的結(jié)果是什么?是一個(gè)和,和是整數(shù)。返回值的類型是int。 明確2:功能的未知內(nèi)容有么?有,加數(shù)和被加數(shù)。都是int類型,這就是參數(shù)列表。?
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;
? ? }????
?
誤區(qū)?
功能內(nèi)只定義所需的內(nèi)容,不需要的不定義。?
重載(overload)?
定義:在同一個(gè)類中,允許存在一個(gè)以上的同名函數(shù),只要它們的參數(shù)個(gè)數(shù)或者參數(shù)類型不同即可。 特點(diǎn):與返回值類型無關(guān),只看參數(shù)列表。 優(yōu)點(diǎn):方便于閱讀,優(yōu)化了程序設(shè)計(jì)。?
//函數(shù)名定義就是為了描述該功能。
?
? ? //兩個(gè)整數(shù)求和的功能
? ? public static int add(int a,int b) {????
? ? ? ? return a+b;
? ? }
? ? //三個(gè)整數(shù)求和
? ? public static int add(int a,int b,int c) {????
? ? ? ? return a+b+c;
? ? }
? ? //兩個(gè)小數(shù)的和
? ? 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();
? ? ? ? }
? ? }
?
重載選擇題練習(xí)?
只要函數(shù)名相同,參數(shù)列表不同:順序、個(gè)數(shù)、類型不同的都算重載。 給定void show(int a,float b,char c){} 下列哪些函數(shù)和給定函數(shù)重載了。 a.int show(int x,float y,char z){} //沒有重載,這個(gè)函數(shù)不允許和給定函數(shù)存在于同一個(gè)類中,因?yàn)闀?huì)產(chǎn)生調(diào)用的不確定性。 b.void show(float b,int a,char c){} //重載了,參數(shù)列表不同,順序不同 c.void show(int c,float a,char b){} //沒有重載,和給定函數(shù),不允許存在 d.void show(int a,int b,int c){} //重載了,因?yàn)轭愋筒煌?e.double show(){} //重載了,因?yàn)閭€(gè)數(shù)不同?
函數(shù)的內(nèi)存調(diào)用問題?
舉例:?
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;
? ? }????
?
棧:先進(jìn)棧的后出棧 進(jìn)棧(壓棧) 出棧(彈棧)?
數(shù)組?
定義?
概念:同一種類型數(shù)據(jù)的集合。其實(shí)數(shù)組就是一個(gè)容器。 優(yōu)點(diǎn):數(shù)組可以存儲(chǔ)多個(gè)數(shù)據(jù),可以自動(dòng)給數(shù)組中的元素從0開始編號(hào),方便通過編號(hào)(索引)操作這些元素。 數(shù)組中的元素默認(rèn)為0。 格式1:?
//元素類型[] 數(shù)組名=new 元素類型[元素個(gè)數(shù)或數(shù)組長度];
//示例如下:
int[] arr=new int[5];//通過new關(guān)鍵字創(chuàng)建了一個(gè)長度為5,元素類型為int的數(shù)組實(shí)體
?
格式2:?
//元素類型[] 數(shù)組名=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是數(shù)組的長度
? ? ?System.out.println("arr["+i+"]="+arr[i]);
?
數(shù)組的內(nèi)存圖解?
java對(duì)內(nèi)存空間的劃分,分為五部分: 棧、堆、方法區(qū)、本地方法區(qū)、寄存器。?
棧內(nèi)存: 存儲(chǔ)的都是局部變量,只要是在方法中定義的變量都是局部變量。 一旦變量的生命周期結(jié)束,該變量就被釋放。?
堆內(nèi)存: 存儲(chǔ)的都是實(shí)體(對(duì)象)能被new創(chuàng)建的, 每一個(gè)實(shí)體都有一個(gè)首地址值。 堆內(nèi)存的變量都有默認(rèn)初始化值。 不同類型不一樣.int:0;double:0.0;boolean:false;char:’\u000’?
堆把首地址告訴棧即可,arr是引用型變量,當(dāng)不想把a(bǔ)rr指向?qū)嶓w時(shí),只要將arr=null; 當(dāng)實(shí)體不再使用時(shí),就會(huì)被垃圾回收機(jī)制處理。? ??
數(shù)組的常見問題?
1.Array Index out of Bounds Exception數(shù)組角標(biāo)溢出異常//訪問到了數(shù)組不存在的索引時(shí),會(huì)發(fā)生該異常。 2.Null Pointer Exception空指針異常//當(dāng)使用沒有任何實(shí)體指向的引用變量操作實(shí)體時(shí),運(yùn)行會(huì)發(fā)生該異常。?
應(yīng)用?
數(shù)組常見操作 1.獲取最值(最大值,最小值) 2.排序(選擇排序,冒泡排序) 3.折半查找(二分查找)?
求和?
需求:獲取多個(gè)數(shù)的和的功能。 明確1:結(jié)果?int 明確2:參數(shù)?多個(gè)數(shù),定義多個(gè)參數(shù)合適嗎?既然是一組數(shù),數(shù)組。 步驟: 1.定義變量,記錄和 2.通過循環(huán)對(duì)數(shù)組進(jìn)行遍歷?
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;
? ? }
?
最大值?
需求:獲取多個(gè)整數(shù)中最大值。 思路: 1.數(shù)據(jù)多了,為了便于操作,需要容器,用數(shù)組。 2.多個(gè)數(shù)據(jù)需要進(jìn)行比較,每次都有較大的數(shù),需要記錄下來和下一個(gè)數(shù)比較。 3.將數(shù)組中的元素都比一遍。最后,就有了最大值。 步驟: 1.需要數(shù)組。 2.定義一個(gè)變量記錄住較大的數(shù)。 3.對(duì)數(shù)組進(jìn)行遍歷,讓元素和較大的值進(jìn)行比較。 如果元素大于較大的數(shù),用變量記錄該元素。 4.遍歷完成后,變量中記錄就是最大值。 //定義功能。 明確1:結(jié)果?最大值。 明確2:參數(shù)?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){ }中的內(nèi)容替換為?
public static int getMax_2(int[] arr) {
? ? ? ? int max=0;//初始化為數(shù)組中的任意一個(gè)角標(biāo)
? ? ? ? for(int i=1;i<arr.length;i++) {
? ? ? ? ? ? if (arr[max]<arr[i])
? ? ? ? ? ? ?max=i;?????????
? ? ? ? }
? ? ? ? return arr[max];
? ? }
?
將數(shù)組轉(zhuǎn)成字符串?
需求1:定義功能,將[34,12,67]數(shù)組中的元素轉(zhuǎn)成字符串“[34,12,67]” 明確1:結(jié)果?字符串。 明確2:參數(shù)?數(shù)組。 思路:簡(jiǎn)單的方式就是利用了字符串和任何數(shù)據(jù)相加都是相連接。 步驟: 1.定義字符串變量 2.遍歷數(shù)組。將每一個(gè)數(shù)組的元素和字符串相連接。 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;
? ? }
?
結(jié)果:?
string=[23,44,1,23,56,78]
?
查表法?
數(shù)組使用的核心思想: 容器特點(diǎn):1.固定長度;2.元素都有索引。 什么時(shí)候使用容器呢?數(shù)據(jù)多了,必須先進(jìn)行存儲(chǔ),然后進(jìn)行操作。 對(duì)于數(shù)組容器什么時(shí)候用呢?數(shù)據(jù)多,個(gè)數(shù)確定,而且有對(duì)應(yīng)關(guān)系。 在分析需求時(shí): 1.需求中的數(shù)據(jù)是否有對(duì)應(yīng)的有序編號(hào)? 2.需求中的數(shù)據(jù)是否需要有序的編號(hào)。 如果有,就用數(shù)據(jù)存儲(chǔ)。 例1:一組數(shù):34 89 12 78 45 要對(duì)他們進(jìn)行操作。需要編號(hào),操作更容易。 例2:根據(jù)用戶輸入的數(shù)據(jù),顯示對(duì)應(yīng)的星期。 思路: 1.星期有多個(gè),個(gè)數(shù)固定。 2.星期對(duì)應(yīng)的有序編號(hào),有序的編號(hào)就可以作為索引。 所以可以使用數(shù)組這種結(jié)構(gòu)進(jìn)行存儲(chǔ)。 需求: 定義一個(gè)功能,根據(jù)給定的數(shù)據(jù)獲取對(duì)應(yīng)的星期。 查表法:數(shù)據(jù)之間存在對(duì)應(yīng)關(guān)系,通過關(guān)系中一方查詢另一方。 當(dāng)對(duì)應(yīng)關(guān)系存在,但沒有一方是有序編號(hào)時(shí),使用另一個(gè)容器map。 步驟: 1.定義一個(gè)數(shù)組,存儲(chǔ)固定的星期數(shù)。這個(gè)稱之為一個(gè)存儲(chǔ)了對(duì)應(yīng)關(guān)系的表。?
public static void main(String[] args) {
? ? ? ? int num=7;
? ? ? ? String? week=getWeek(num);
? ? ? ? System.out.println(num+"對(duì)應(yīng)的星期為"+week);
? ? ? ? }
? ??
? ? public static String getWeek(int num) {
? ? ? ? String[] weeks = new String[]{"","星期一","星期二","星期三","星期四","星期五","星期六","星期日"};//其實(shí)就是根據(jù)制定的索引在查表? ?
? ? ? ? if (num>7||num<1)
? ? ? ? ? ? return num+"沒有對(duì)應(yīng)的星期";//throw new RuntimeException("沒有對(duì)應(yīng)的星期");拋出異常,return結(jié)束當(dāng)前功能,拋出異常是結(jié)束當(dāng)前程序
? ? ? ? else? ? ? ? ? ??????
? ? ? ? ? ? return weeks[num];? ?????
? ? }
?
轉(zhuǎn)十六進(jìn)制?
需求:十進(jìn)制—>十六進(jìn)制 &15 >>>4 循環(huán) 原本:?
public static void main(String[] args) {
? ? ? ? int num=60;
? ? ? ? for(int i=0;i<8;i++) {//4個(gè)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.每運(yùn)算出一位,不要打印,先存儲(chǔ),需要容器。 2.去除零?需要轉(zhuǎn)換的數(shù)據(jù)會(huì)不斷地右移,如果右移后剩余的二進(jìn)制都是0,也就是沒有有效位,就不需要進(jìn)行&運(yùn)算了。也就是不需要再往數(shù)組中存儲(chǔ)了。?
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.定義容器,存儲(chǔ)的是字符,長度位8,一個(gè)整數(shù)最多8個(gè)16進(jìn)制位。
? ? ? ? char[] chas=new char[8];
? ? ? ? //2.定義一個(gè)用于操作數(shù)組的索引。
? ? ? ? //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.讓角標(biāo)自增。
? ? ? ? //? ? index--;
? ? ? ? ? ? num=num>>>4;????????????????
? ? ? ? }
? ? ? ? /*
? ? ? ? // 4.遍歷數(shù)組。
? ? ? ? for(int i=0;i<chas.length;i++) {
? ? ? ? ? ? System.out.print(chas[i]+",");? ?????????
? ? ? ? }
? ? ? ? */
? ? ? ? System.out.println("index="+index);
? ? ? ? return "0x"+toString(chas,index);
? ? }
? ? ? ? ? ?//定義一個(gè)功能,將字符數(shù)組轉(zhuǎn)成字符串
? ? ? ? public static String toString(char[] arr,int index){
? ? ? ? String temp="";
? ? ? ? for(int i=index;i<arr.length;i++) {
? ? ? ? ? ? temp=temp+arr[i];? ??????????
? ? ? ? }
? ? ? ? return temp;
? ? }
?
查表版(十六進(jìn)制終極版)?
思路: 十進(jìn)制轉(zhuǎn)成十六進(jìn)制的每一位都是十六進(jìn)制元素中的某一個(gè)。 十六進(jìn)制中的元素有很多固定個(gè)數(shù),而且還有對(duì)應(yīng)的編號(hào)。 所以可以使用傳說中的查表法。?
? ? 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.創(chuàng)建臨時(shí)容器。
? ? ? ? char[] arr=new char[8];
? ??????
? ? ? ? //創(chuàng)建操作臨時(shí)容器的索引。
? ? ? ? int index=arr.length;
? ??????
? ? ? ? //4.通過循環(huán)對(duì)num進(jìn)行& >>>等運(yùn)算
? ? ? ? while(num!=0) {
? ? ? ? ? ? //5.對(duì)num進(jìn)行&運(yùn)算。
? ? ? ? ? ? int temp=num&15;
? ??????????
? ? ? ? ? ? //根據(jù)&運(yùn)算后的結(jié)果作為角標(biāo)查表,獲取對(duì)應(yīng)字符,并將字符存儲(chǔ)放到臨時(shí)容器中。
? ? ? ? ? ? arr[--index]=chs[temp];
? ??????????
? ? ? ? ? ? //7.對(duì)num進(jìn)行右移。
? ? ? ? ? ? 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;
? ? ? ? ?}
?
十進(jìn)制轉(zhuǎn)二進(jìn)制?
public static void main(String[] args) {
? ? ? ? int num=60;
? ? ? ? String binary=toBina(num);
? ? ? ? System.out.println(hex);
? ? }
? ? //將輸出的數(shù)字存儲(chǔ)在數(shù)組中,返回類型為char,輸入的參數(shù)列表為int
? ? public static String toBina(int num) {
? ? ? ? //查表
? ? ? ? char[] binary= {'0','1'};
? ? ? ? //建立新的存儲(chǔ)容器
? ? ? ? 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;
? ? }
?
進(jìn)制轉(zhuǎn)換(通用版)?
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+"的十六進(jìn)制為"+str_hex);
? ? ? ? System.out.println(num+"的二進(jìn)制為"+str_binary);
? ? ? ? System.out.println(num+"的八進(jìn)制為"+str_oct);
? ? }
? ? //十進(jìn)制-->十六進(jìn)制
? ? public static String toHex(int num) {
? ? ? ? return "0x"+trans(num,15,4);
? ? }
? ??
? ? //十進(jìn)制-->二進(jìn)制
? ? public static String toBinary(int num) {
? ? ? ? return trans(num,1,1);
? ? }
? ??
? ??
? ? //十進(jìn)制-->八進(jìn)制
? ? public static String toOctal(int num) {
? ? ? ? return "0"+trans(num,7,3);
? ? }
? ??
? ??
? ? //用于進(jìn)制轉(zhuǎn)換
? ? 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.創(chuàng)建臨時(shí)容器。
? ? ? ? char[] arr=new char[32];
? ??????
? ? ? ? //創(chuàng)建操作臨時(shí)容器的索引。
? ? ? ? int index=arr.length;
? ??????
? ? ? ? //4.通過循環(huán)對(duì)num進(jìn)行& >>>等運(yùn)算
? ? ? ? while(num!=0) {
? ? ? ? ? ? //5.對(duì)num進(jìn)行&運(yùn)算。
? ? ? ? ? ? int temp=num&base;
? ??????????
? ? ? ? ? ? //根據(jù)&運(yùn)算后的結(jié)果作為角標(biāo)查表,獲取對(duì)應(yīng)字符,并將字符存儲(chǔ)放到臨時(shí)容器中。
? ? ? ? ? ? arr[--index]=chs[temp];
? ??????????
? ? ? ? ? ? //7.對(duì)num進(jìn)行右移。
? ? ? ? ? ? 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;
? ? ? ? ?}
?
總結(jié):java有一種幫助文檔,里面封裝了很多函數(shù)。 包括進(jìn)制轉(zhuǎn)換:?
//java已提供的功能
System.out.println(Integer.toBinaryString(28));
System.out.println(Integer.toOctalString(28));
System.out.println(Integer.toHexString(28));
?
選擇排序?
數(shù)組的排序 選擇排序(Selection sort)是一種簡(jiǎn)單直觀的排序算法。它的工作原理是每一次從待排序的數(shù)據(jù)元素中選出最小(或最大)的一個(gè)元素,存放在序列的起始位置,然后,再從剩余未排序元素中繼續(xù)尋找最小(大)元素,然后放到已排序序列的末尾。以此類推,直到全部待排序的數(shù)據(jù)元素排完。 選擇排序是不穩(wěn)定的排序方法。 外循環(huán):不同起點(diǎn) 內(nèi)循環(huán):同起點(diǎn)的不同箭頭 確定頭(最小)??
public static void main(String[] args) {
? ? ? ? int[] arr=new int[] {12,9,23,77,6,34};
? ? ? ? printArray(arr);
? ? ? ? selectSort(arr);
? ? ? ? printArray(arr);????????
? ? ? ? }
? ??
? ? //打印數(shù)組的方法
? ? 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]);
? ? ? ? }
? ? }
? ? //數(shù)組的排序,選擇排序
? ? 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);????????
? ? ? ? }
? ??
? ? //打印數(shù)組的方法
? ? 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]);
? ? ? ? }
? ? }
? ? //數(shù)組的排序,冒泡排序
? ? 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);//開發(fā)時(shí)用該調(diào)優(yōu)。
? ? ? ? ? ?printArray(arr);????????
? ? ? ? }????
? ? //打印數(shù)組的方法
? ? 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]);
? ? ? ? }
? ? }
?
發(fā)現(xiàn)排序方法,位置置換代碼重復(fù),進(jìn)行抽取。?
? ? 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);? ? ? ? ? ??
? ? ? ? }
? ??
? ? //打印數(shù)組的方法
? ? 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]);
? ? ? ? }
? ? }
? ? //數(shù)組的排序,選擇排序
? ? ? ? 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);
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? //數(shù)組的排序,冒泡排序
? ? 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) {//角標(biāo)要先有數(shù)組
? ? ? ? int temp=arr[a];
? ? ? ? arr[a]=arr[b];
? ? ? ? arr[b]=temp;????????
? ? }
?
普通查找方式?
需求:查找一個(gè)元素在數(shù)組中的第一次出現(xiàn)的位置。?
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);
? ? ? ? }
? ??
? ? //打印數(shù)組的方法
? ? public static int searchKey(int[] arr,int key) {????????
? ? ? ? //遍歷查找
? ? ? ? for(int i=0;i<arr.length;i++) {
? ? ? ? ? ? if(arr[i]==key)
? ? ? ? ? ? ? ? return i;
? ? ? ? }
? ? ? ? //數(shù)組中不存在的角標(biāo),為-1
? ? ? ? return -1;//代表角標(biāo)不存在的情況
? ? }
?
二分查找方式?
前提:數(shù)組必須是有序(遞增或遞減)的。??
思路: 1.通過角標(biāo)先獲取中間角標(biāo)上元素。 2.讓該元素和要找的數(shù)據(jù)比較。 3.如果要找的數(shù)大了,縮小范圍,要找的范圍應(yīng)該是 中間的角標(biāo)+1-----尾角標(biāo)。 4.如果要找的小了,縮小范圍,要找的范圍應(yīng)該是 頭角標(biāo)-----中間的角標(biāo)+1。 5.不斷如此重復(fù),就可以找到元素對(duì)應(yīng)的角標(biāo)。?
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.定義三個(gè)變量,記錄頭角標(biāo)、尾角標(biāo)、中間角標(biāo)
? ? ? ? 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) { }中的內(nèi)容換成?
public static int binarySearch(int[] arr,int key) {
? ? ? ? //1.定義三個(gè)變量,記錄頭角標(biāo)、尾角標(biāo)、中間角標(biāo)
? ? ? ? ? ? ? ? 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;
?
數(shù)組中的數(shù)組[][]?
開發(fā)時(shí)并不常用 比如說俄羅斯方塊的坐標(biāo)點(diǎn)?
格式1?
int[][] arr=new int[3][2];
?
定義了名稱為arr的二維數(shù)組; 二維數(shù)組中有3個(gè)一維數(shù)組; 每一個(gè)一維數(shù)組中有2個(gè)元素; 一維數(shù)組的名稱分別為arr[0],arr[1],arr[2]; 給第一個(gè)一維數(shù)組1腳標(biāo)位賦值為78寫法為:arr[0][1]=78。 二維數(shù)組分布情況:??
int[][] arr=new int[3][2];
System.out.println(arr);
//輸出為[[I@15db9742//二位數(shù)組實(shí)體。//@右邊為哈希值,實(shí)體在內(nèi)存中存放的位置;@左邊[是數(shù)組,[[是而二維數(shù)組,I是類型int.
System.out.println(arr[0]);//輸出為[I@6d06d69c//一維數(shù)組實(shí)體。
System.out.println(arr[0][0]);//一維數(shù)組中的元素。
?
格式2?
int[][] arr=int[3][];
?
二維數(shù)組中有3個(gè)一維數(shù)組; 每個(gè)一維數(shù)組都是默認(rèn)初始值null; 可以對(duì)這個(gè)三個(gè)一維數(shù)組分別進(jìn)行初始化 arr[0]=new int[3]; arr[1]=new int[1]; arr[2]=new int[2]; 二維數(shù)組分布情況:? 定義一維數(shù)組后的分布:??
int[][] array=new int[3][];//明確了二維數(shù)組的長度,沒有明確具體的一維數(shù)組。
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++) {//遍歷二維數(shù)組
? ? ? ? ? ? for(int j=0;j<arr[i].length;j++)
? ??????????
? ? ? ? ? ? sum+=arr[i][j];????????????
? ? ? ? }????????
? ? ? ? System.out.println(sum);
?
數(shù)組的練習(xí)?
數(shù)組反轉(zhuǎn)?
需求:對(duì)一個(gè)給定的數(shù)組進(jìn)行反轉(zhuǎn)。 [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;
? ? }
?
獲取插入點(diǎn)?
需求:如果往有序的數(shù)組中插入一個(gè)元素并繼續(xù)保持有序,問如何獲取該位置? 思路: 1.既然是有序的數(shù)組,而且是找位置,必須要想到二分查找法。?
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里的封裝函數(shù)?
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);//如果該數(shù)不存在,用負(fù)數(shù)告訴該值不存在且插入值在哪里。還可以避免-0.
? ? ? ? }? ?????
? }
總結(jié)
以上是生活随笔為你收集整理的[转载] JAVA笔记_(Day04,Day05)函数数组的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: haarcascades---各种分类器
- 下一篇: [转载] Java中的静态方法不能被子类