[連載]Java程序設計(03)---任務驅動方式:尋找高富帥和屌絲
任務:相同在上一家公司。公司還須要一個程序來找出當月工資最高的員工(高富帥)和當月工資最低的員工(屌絲)。
我們先定義一個類描寫敘述員工(Employee)。為員工擬定姓名(name)和工資(salary)兩個屬性。
Java是一個面向對象的編程語言,員工是對象。我們把員工共同的屬性和行為抽取出來,就能夠定義出員工類。
定義一個類的過程就是一個抽象的過程,我們要做兩種抽象:數據抽象(定義對象的屬性)和行為抽象(定義對象的方法)。從問題中抽取出類的方法事實上非常easy。就是找名詞和動詞,名詞會成為類或者類中的屬性。動詞會成為類中的方法。
接下來我們用隨機的方式創建員工並指定其工資並找出高富帥和屌絲。package com.lovo; /** * 員工類 * @author 駱昊 */ public class Employee { private String name; // 員工姓名 private double salary; // 員工工資 /** * 構造器 * @param name 姓名 * @param salary 工資 */ public Employee(String name, double salary) { this.name = name; this.salary = salary; } /** * 獲取員工姓名 * @return 姓名 */ public String getName() { return name; } /** * 獲取員工工資 * @return 工資 */ public double getSalary() { return salary; } public String toString() { return name + " : " + salary; } }
package com.lovo; public class MaxMin { /** * 查找最高工資的員工 * @param es 裝全部員工的數組 * @return 最高工資的員工 */ public static Employee findMax(Employee[] es) { Employee max = es[0]; // 假設第一個員工就是工資最高的員工 // 從第二個員工開始找比高富帥工資更高的員工 for(int i = 1; i < es.length; i++) { // 比當前的高富帥工資更高就是新的高富帥 if(es[i].getSalary() > max.getSalary()) { max = es[i]; } } return max; } /** * 查找最低工資的員工 * @param es 裝全部員工的數組 * @return 最低工資的員工 */ public static Employee findMin(Employee[] es) { Employee min = es[0]; // 假設第一個員工就是工資最低的員工 for(int i = 1; i < es.length; i++) { // 比當前的屌絲工資更低就是新的屌絲 if(es[i].getSalary() < min.getSalary()) { min = es[i]; } } return min; } public static void main(String[] args) { // 用一個字符串數組保存員工的姓名 String[] names = {"趙雲", "黃忠", "典韋", "許褚", "張飛", "馬超", "曹仁", "甘寧"}; // 創建一個數組保存全部員工並用1000-5000的隨機數作為員工工資 Employee[] emps = new Employee[names.length]; for(int i = 0; i < emps.length; i++) { int salary = (int) (Math.random() * 4001 + 1000); emps[i] = new Employee(names[i], salary); System.out.println(emps[i]); // 在控制臺打印員工信息(調用toString()方法) } Employee wealthy = findMax(emps); // 高富帥 Employee cockwire = findMin(emps); // 屌絲 System.out.println("[高富帥]\t" + wealthy); System.out.println("[屌絲]\t" + cockwire); } }
事實上大家可能註意到了。上面代碼中的findMax和findMin方法的代碼事實上非常相似,明顯。這兩個方法是能夠合並為一個方法的,請大家自己思考:)
在Java中數組也是對象類型。所謂數組就是一個存儲數據的倉庫,它包括了若幹個倉位。編號從0開始。創建數組的時候能夠用靜態初始化的方式(如上面樣例中員工名字的數組),也能夠用new運算符並指定數組中元素的個數(names.length)。
在創建數組對象後,能夠通過數組對象的length屬性獲取數組中元素的個數。
數組能夠通過下標運算[]來操作數組中的元素,下標的範圍是0到數組的length-1。通常能夠用循環來控制數組的下標並操作數組元素。
假設數組中的每一個元素又是數組。那麽能夠將其稱之為二維數組,二維數組非常像我們平時使用的表格(table),有若幹行若幹列來存儲數據。也非常像數學中的矩陣(matrix)。除此之外。2D遊戲中的地圖也能夠用二維數組來表示。國際象棋、五子棋等棋類遊戲的棋盤也能夠用二維數組來表示。以下是一個用二維數組生成10行楊輝三角的樣例,楊輝三角例如以下所看到的。當中每行的數字就是二項式從0次方到N次方的展開系數。
1
1 ?1
1 ?2 ?1
1 ?3 ?3 ?1
1 ?4 ?6 ?4 ?1
... ... ... ... ... ...
package com.lovo;
public class YangHuiTriangle {
public static void main(String[] args) {
int[][] array = new int[10][];
for(int i = 0; i < array.length; i++) {
array[i] = new int[i + 1];
for(int j = 0; j < array[i].length; j++) {
if(j == 0 || j == i) { // 元素在對角線上或在第一列就是1
array[i][j] = 1;
}
else { // 其它位置的元素是它上一行的元素加上上一行前一列的元素的和
array[i][j] = array[i - 1][j] + array[i - 1][j - 1];
}
System.out.print(array[i][j] + "\t");
}
System.out.println();
}
}
}
關於數組。另一個重要的應用就是排序。盡管Java API(應用程序編程接口)中的Arrays類提供了排序的sort()方法,可是以下的代碼還是用一種盡管算不上有效率可是仍然非常經典的冒泡排序實現數組元素的從小到大(升序)排序。
冒泡排序的原理是:對數組中的元素進行兩兩比較,假設前面的元素比後面的元素大,那麽就交換兩個元素。這樣一趟下來最大的元素就被移動到數組的末尾。再進行第二趟,將第二大的元素放到倒數第二個位置。這樣。大的沈下去小的浮起來。這就是冒泡排序。
package com.lovo;
public class Bubble {
public static void bubbleSort(int[] array) {
boolean swapped = true; // 是否發生了元素交換的布爾值(假設為false表示沒有元素交換則排序完畢)
for(int i = 1; swapped && i <= array.length - 1; i++) {
swapped = false;
for(int j = 0; j < array.length - i; j++) {
if(array[j] > array[j + 1]) { // 前面的元素大於後面的元素就交換兩個元素
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
swapped = true;
}
}
}
}
public static void main(String[] args) {
int[] x = new int[10];
System.out.println("排序前: ");
for(int i = 0; i < x.length; i++) {
x[i] = (int) (Math.random() * 100); // 為數組元素賦上0-99的隨機值
System.out.print(x[i] + " ");
}
bubbleSort(x);
System.out.println("\n排序後: ");
for(int y : x) { // 用for-each循環打印數組中的元素
System.out.print(y + " ");
}
}
}
[連載]Java程序設計(03)---任務驅動方式:尋找高富帥和屌絲