2012年11月9日 星期五

陣列的排序-遞增的另一個做法

還有一個方式也可以做到陣列排序由小到大
使用 Arrays.sort()

程式:
import java.util.Arrays;

public class Test{

    public static void main(String[] args){

        int[] i ={80,20,40,30,10};

        Arrays.sort(i);
        System.out.println(Arrays.toString(i));
    }
}

執行結果:
[10, 20, 30, 40, 80]

可以看到程式自動將一開始我們指定的數由小到大重新排列了

當然也可以用在文字排列上

程式:
import java.util.Arrays;

public class Test{

    public static void main(String[] args){

        String[] i ={"ada","sid","data"};

        Arrays.sort(i);
        System.out.println(Arrays.toString(i));
    }
}

執行結果:
[ada, data, sid]

程式自動按照字首的順序將字串進行排序了
可是值得注意的是
他是按照第一個字元做大小排列

類別庫

java.lang        語言的相關類別
java.io       輸出入的相關類別
java.util          工具程式的相關類別
java.security     安全性的相關類別
java.text              數值與日期等國際化的相關類別
java.awt              AWT(abstract Window Tookit)的相關類別
java.applet          Applet的相關類別
java.beans          JavaBeans的相關類別
java.math            數值運算的相關類別
java.net               網路的相關類別
java.rmi               RMI(Remote Method Invocation)的相關類別
java.sql               存取資料來源的相關類別
javax.accessibility    使用者輔助功能的相關類別
javax.naming           名稱搜尋服務的相關類別
java.sound       音訊的相關類別
javax.swing      Swing的相關類別
javax.xml.parsers  處理XML文件的類別
javax.xml.transform    執行XML文件之轉換的類別

相關類別庫的參考網址:
http://docs.oracle.com/javase/7/docs/

在java內已經有不少類別物件提供開發者使用,開發程式時會使用到的類別(class)檔案都可以從這邊去尋找並使用

基本中的基本

程式的基本架構
一定先有一個框架

public class Test{

    public static void main(String[] args){

    }
}

再來看程式內容需要
有需要什麼類型的變數就宣告變數型態
像是
int i  整數型態

int[] i 陣列型態

如果需要顯示出結果則是
System.out.print();

程式內需要條件判斷時,則使用
if()

switch(){
 case :
 break;
 default:
 break;
}

有需要用到迴圈則是
while(){
}

do(){
}while();

for(){
}

透過鍵盤輸入值則是

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

使用前要先宣告
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;

另一個用法是
Scanner a = new Scanner(System.in);

使用前要宣告
import java.util.Scanner;

最基本型態大致上就如此
我覺得就像是人體最基本的單位,細胞吧

2012年11月8日 星期四

多維陣列

多維陣列的概念就是陣列中還有陣列
像是 test[0][0] ,這是個二維陣列

舉例說明,例如有兩個人,分別有3科成績國文、英文、數學

就可以用多維陣列表示

test[0][0]  第一個人的國文 test[1][0]  第二個人的國文
test[0][1]  第一個人的英文 test[1][1]  第二個人的英文
test[0][2]  第一個人的數學 test[1][2]  第二個人的數學

陣列的排序

將陣列內的數字排列大小後顯示出來
使用之前的輸入成績的程式來加東西

程式:
import java.util.Scanner;

public class Test{

    public static void main(String[] args){

        System.out.println("請輸入班級人數:");
        Scanner a = new Scanner(System.in);

        int num = a.nextInt();
        int[] t = new int[num];
        System.out.println("請輸入考試分數:");

        for(int i = 0; i < num; i++){
            t[i]=a.nextInt();
        }

        for(int i = 0; i < num; i++){
            System.out.println("第"+(i+1)+"個人"+t[i]+"分");
        }

//這段開始作成績排序       
        System.out.println("成績排序");
        for(int x=0;x<t.length-1; x++){
            for(int y=x+1;y<t.length; y++){
                if(t[y] > t[x]){
                    int tmp = t[y];
                    t[y] = t[x];
                    t[x] = tmp;
                }
            }
        }

       
        for(int j=0; j<t.length; j++){
            System.out.println("第"+(j+1)+"名"+t[j]+"分");
        }
       

    }
}

結果:
請輸入班級人數:
5
請輸入考試分數:
10
30
20
50
40
第1個人10分
第2個人30分
第3個人20分
第4個人50分
第5個人40分
成績排序
第1名50分
第2名40分
第3名30分
第4名20分
第5名10分


單把成績排序那段拿出來看好了

        for(int x=0;x<t.length-1; x++){
            for(int y=x+1;y<t.length; y++){
                if(t[y] > t[x]){
                    int tmp = t[y];
                    t[y] = t[x];
                    t[x] = tmp;
                }
            }
        }

這段程式使用了兩個for迴圈來做數字大小的比較

第一個 for 宣告了 int x ,需要的範圍是0~3
第二個 for 宣告了 int y ,需要的範圍則是1~4

if 則開始判斷 t[y] > t[x] 的時候,將兩個數值交換

然後依序下去判斷接下來的數值,來進行排序

推算如下:

判斷式    如果後面真的比前面大 排序就交換,否則不換
t[1] > t[0] 30 10 20 50 40
t[2] > t[0] 30 10 20 50 40
t[3] > t[0] 50 30 10 20 40
t[4] > t[0] 50 30 10 20 40

t[2] > t[1] 50 30 10 20 40
t[3] > t[1] 50 30 10 20 40
t[4] > t[1] 50 40 30 10 20

t[3] > t[2] 50 40 30 10 20
t[4] > t[2] 50 40 30 10 20

t[4] > t[3] 50 40 30 20 10

完成排序

陣列的長度

如果要得知一個陣列有多長,可以使用 length 來取得長度

例如:

public class Test{

    public static void main(String[] args){

//先準備5格空間
        int[] t = new int[5];

//列出陣列長度
       System.out.println("陣列的長度為"+t.length);

    }
}

結果:
陣列的長度為5


若是透過鍵盤輸入的話

import java.util.Scanner;

public class Test{

    public static void main(String[] args){

//透過鍵盤輸入想要的長度
        System.out.println("請輸入想要的陣列長度:");
        Scanner a = new Scanner(System.in);
        int num = a.nextInt();
        int[] t = new int[num];

//將輸入的長度讀取出來
        System.out.println("陣列的長度為"+t.length);

    }
}

結果:
請輸入想要的陣列長度:
5
陣列的長度為5


陣列-array

陣列的概念,就像是準備很多箱子,用來存放資料
它的特性是,「一次可以存放大量同性質資料」

例如
int[] test;
宣告了一個陣列變數

test = new int[5];
準備了五個空間,每個都可以儲存int型態的資料

當然也可以寫在一起
int[] test = new int[5];

指定資料給陣列

在每個陣列的格子內放入整數資料

int[] test = new int[5];

test[0] = 80;
test[1] = 60;
test[2] = 22;
test[3] = 50;
test[4] = 75;

然後就可以列印出來

class Test{

    public static void main(String[] agrs){

//這邊宣告陣列和陣列中的值
        int[] test = new int[5];

        test[0] = 80;
        test[1] = 60;
        test[2] = 22;
        test[3] = 50;
        test[4] = 75;


//此行開始宣告第幾個人幾分
        for(int i = 0;i < 5; i ++)
        System.out.println("第"+(i+1)+"個人"+test[i]+"分");

    }
}

得到結果:
第1個人80分
第2個人60分
第3個人22分
第4個人50分
第5個人75分 



但是要注意的是,上面的陣列程式只有指定了5個位置來存放資料,如果刻意去讀取不存在的資料位置就會出錯
例如 int[10] ,並沒有這個值,所以會讀取不到資料

也可以使用陣列的初始化方式,得到的結果也會和上面相同

int[] test = {80,60,22,50,75}

透過鍵盤輸入陣列值

假設一個目標
現在需要一個程式,一開始可以先指定班級有幾個人,然後再逐一輸入成績,最後列印出結果

程式:
//一開始宣告要使用到的class
import java.util.Scanner;

public class Test{

    public static void main(String[] args){

//這行宣告輸入班上多少人
        System.out.println("請輸入班級人數:");
        Scanner a = new Scanner(System.in);


//接下來把輸入的數字變成準備多少陣列空間
        int num = a.nextInt();
        int[] t = new int[num];


//接著依序輸入成績
        System.out.println("請輸入考試分數:");
        for(int i = 0; i < num; i++){
            t[i]=a.nextInt();
        }

//最後列印出陣列的內容
        for(int i = 0; i < num; i++){
            System.out.println("第"+(i+1)+"個人"+t[i]+"分");
        }

    }
}

結果:
請輸入班級人數:
5
請輸入考試分數:
10
20
304
40
50
第1個人10分
第2個人20分
第3個人304分
第4個人40分
第5個人50分

do~while

do{
  敘述;
}while(條件);

先直行一次do裡面的程式,再來判斷while裡面的條件是否為true,只要為true就再次執行do裡面的程式

與while不同的地方是,while是先判斷再執行,do~while是先執行再判斷

public class Test{

    public static void main(String[] args){
  
        int i = 1;

        do{

            System.out.println("第"+ i +"次執行");
            i++;

        }while(i < 5);
      
        System.out.println("執行結束");  
    }

}

結果:
第1次執行
第2次
執行 
第3次執行
第4次執行 
執行結束

2012年11月1日 星期四

while

while(條件式){
敘述句;
 ...
}

當條件式為true時,程式區段內的程式碼會重複執行


例如:

public class Test{

    public static void main(String[] args){

        int i = 1;

        while(i < 5){


            System.out.println("第"+ i +"次執行");
            i++;

 

        }
        System.out.println("執行結束");

    }

}

結果:
第1次執行
第2次執行
第3次執行
第4次執行
執行結束


其中 i++; 如果沒有寫入,則會造成無窮迴圈

for

for(設定段;條件段;運算段){
...
}

設定段:可以設定一個變數的起始值

條件段:條件如果為true,則執行 {} 內程式

運算段:在條件段值變為false前,重複執行運算

例如:


public class Test{

    public static void main(String[] args){

        for(int i = 1; i < 5 ; i++){
            System.out.println("第" + i + "次執行");
        }

        System.out.println("執行結束");

    }

}

結果:
第1次執行
第2次執行
第3次執行
第4次執行
執行結束

switch

switch (運算式){

    case 值1:
        敘述句1;
        break ;

    case 值2:
        敘述句2;
        break ;


    default:
        敘述句 d;
        break;
}

命令寫法如上,case部分則看有多少可能發生的值,就輸入多少次
例如:

import java.util.Scanner;

public class Test{

    public static void main(String[] args){


        System.out.println("請輸入1或2");
        Scanner a = new Scanner(System.in);
        int x =a.nextInt();

     
            switch(x){
            case 1:
            System.out.println("輸入的是1");
            break;
            case 2:
            System.out.println("輸入的是2");
            break;
            default:
            System.out.println("請輸入1或2");
            break;
            }

    }

}

結果會執行:
請輸入1或2
1
輸入的是1


break部分如果都沒有加上,則會發生命令一直被使用下去的結果
例如:

import java.util.Scanner;

public class Test{

    public static void main(String[] args){


        System.out.println("請輸入1或2");
        Scanner a = new Scanner(System.in);
        int x =a.nextInt();

     
            switch(x){
            case 1:
            System.out.println("輸入的是1");

            case 2:
            System.out.println("輸入的是2");

            default:
            System.out.println("請輸入1或2");

            }

    }

}

結果沒有中斷:
請輸入1或2
1
輸入的是1
輸入的是2
請輸入1或2

if

if的敘述有分做以下三種

if()

if() ... else

if() ... else if() ...else

1.if()
在小括號內輸入的是一個boolean值,也就是判斷真假的條件

例如,5>3表示真,3>5表示假

條件達成以後,執行以下的動作

if(5>3)

System.out.println("正確");

如此一來畫面就會輸出:正確

2.當 if() 之後要執行兩個敘述時,一定要使用 {} 將內容包起來,否則只會執行最後一條敘述

例如,用鍵盤輸入數字的程式:

import java.util.Scanner;

public class Test{

    public static void main(String[] args){

        System.out.println("請輸入數字");
        
        Scanner a = new Scanner(System.in);

        int x = a.nextInt();

        if( x == 1)
        System.out.println("輸入了1");
        System.out.println("選擇了1");



    }

}

if 後面沒有加 {},再輸入1時會輸出

輸入了1
選擇了1

的結果,但是如果輸入2,結果卻出現

選擇了1

表示,結果就算錯誤,if()後面只跟著判斷一行敘述執不執行

但是如果用 {} 後

 import java.util.Scanner;

public class Test{

    public static void main(String[] args){

        System.out.println("請輸入數字");
       
        Scanner a = new Scanner(System.in);

        int x = a.nextInt();

        if( x == 1){
       
            System.out.println("輸入了1");
            System.out.println("選擇了1");
       
        }

    }

}

程式便會把 {} 內的敘述當作同一個程式區段執行,因此輸入非1的值就不會執行後面的命令

new

new的概念就像是配置一個新的記憶體空間出來,準備給後面的東西使用

像是

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      
Scanner a = new Scanner(System.in);

都表示配置新的記憶體空間給鍵盤輸入使用

public

就像一個遊戲程式來說,一定是由大大小小的各類檔案所組成,寫程式就是如此,寫小的程式,像是加法運算,或者寫一個很大,由眾多class檔組成的java程式,大到如同銀行的系統,高鐵的售票系統等

如何讓程式可以被其他程式使用呢

像一個小的程式來說

public class Hello{
      public static void main(String[] args){
           System.out.println("Hello"); 
      }
}


就算寫成


class Hello{
      public static void main(String[] args){
           System.out.println("Hello"); 
      }
}


也是可以執行的


差別在於有沒有public,今天這個程式是否會被別的程式使用,有宣告則可以,沒宣告則不行

如何去使用他?

public class UseHello{

    public static void main(String[] args){

        String[] x = null;
        Hello.main(x);

    }

}

就可以使用剛剛所寫的Hello的程式