1. 綜合練習
題目 1 :金額轉換為中文大寫格式
請編寫一個 Java 程序,實現將數字金額轉換為中文大寫格式(帶單位)的功能,具體要求如下:
(1) 程序接收用戶輸入的一個整數金額(范圍:0-9999999),如果輸入金額超出范圍,提示 "金額無效" 并要求重新輸入
(2) 轉換規則:
- 將數字轉換為中文大寫形式(零、壹、貳... 玖)
- 為每一位數字添加對應的單位,單位順序為:["佰","拾","萬","仟","佰","拾","元"]
- 不足 7 位的金額需要在高位補 "零",確保總長度為 7 位(例如 123 應補為 7 位:零零零零壹貳叁)
(3) 輸出最終的中文大寫金額字符串,示例如下:
輸入:123
輸出:零佰零拾零萬零仟壹佰貳拾叁元
輸入:1000000
輸出:壹佰零拾零萬零仟零佰零拾零元
public class test8 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int money;while (true) {System.out.println("請錄入一個金額");money = sc.nextInt(); //不太理解,作用域問題if (money >= 0 && money <= 9999999){break;} else{System.out.println("金額無效");}}String moneyStr = "";while (money != 0 ){int ge = money % 10;String capitalNumber = getCapitalNumber(ge);moneyStr = capitalNumber + moneyStr; //不太理解money = money / 10;}int count = 7 - moneyStr.length();for (int i = 0; i < count; i++) {moneyStr = "零" + moneyStr; //不太理解}String[] arr = {"佰","拾","萬","仟","佰","拾","元"};String result = "";for (int i = 0; i < moneyStr.length(); i++) {char c = moneyStr.charAt(i);result = result + c + arr[i];}System.out.println(result);}public static String getCapitalNumber(int number){String[] arr = {"零","壹","貳","叁","肆","伍","陸","柒","捌","玖"};return arr[number];}
}
關鍵邏輯:
①?moneyStr = capitalNumber + moneyStr;?
這種拼接方式相當于每次把新取到的高位數字放在前面,最終得到正確的順序(從高位到低位)。
- 這行代碼的作用是將數字的大寫形式按正確順序拼接,解決了原代碼中順序顛倒的問題,舉例說明:假設輸入金額是?
123
- 第一次循環:取到個位?
3
,capitalNumber
是 "叁",moneyStr
變為 "叁" - 第二次循環:取到十位?
2
,capitalNumber
是 "貳",moneyStr
變為 "貳" + "叁" = "貳叁" - 第三次循環:取到百位?
1
,capitalNumber
是 "壹",moneyStr
變為 "壹" + "貳叁" = "壹貳叁"
② 變量的作用域:
int money;
while (true) {System.out.println("請錄入一個金額");money = sc.nextInt(); //不太理解,作用域問題if (money >= 0 && money <= 9999999){break;} else{System.out.println("金額無效");}
}
- 在 Java 中,在循環內部聲明的變量(如
int money = ...
),其作用域僅限于這個循環內部。 - 當循環結束后,這個變量就會被銷毀,循環外部的代碼(如后續的數字轉大寫邏輯)無法再使用它,因此會出現
找不到符號"money"
的編譯錯誤。
(2)?題目:手機號中間四位脫敏
請編寫一個 Java 程序,實現對手機號的中間四位進行脫敏處理(替換為 * ),具體要求如下:
(1) 定義一個 11 位的手機號字符串(例如:"13528834382")。
(2) 截取手機號的前 3 位和后 4 位。
(3) 將前 3 位 + "****" + 后 4 位拼接,得到脫敏后的手機號。
(4) 輸出脫敏結果。
示例:
輸入(程序中定義):"13500004382"
輸出:"135****4382"
public class test9 {public static void main(String[] args) {String phoneNumber = "13528834382";String start = phoneNumber.substring(0,3);String end = phoneNumber.substring(7); //不太理解String result = start + "****" + end;System.out.println(result);}
}
關鍵邏輯:
① substring(int beginIndex, int endIndex)
(1) 作用:截取從?beginIndex
(包含)到?endIndex
(不包含)之間的子串,返回新字符串。
(2) 參數說明:
beginIndex
:起始索引(包含此位置的字符)endIndex
:結束索引(不包含此位置的字符),即截取范圍是?[beginIndex, endIndex)
②?substring(int beginIndex)
- 作用:從字符串的?
beginIndex
(起始索引)位置開始,截取到字符串的末尾,返回一個新的子串。
2. StringBuilder
方法名 | 說明 |
---|---|
public StringBuilder() | 創建一個空白可變的字符串對象,不包含任何內容 |
public StringBuilder(String str) | 根據字符串的內容,來創建可變字符串對象 |
public StringBuilder append(任意類型) | 添加數據,并返回對象本身 |
public StringBuilder reverse() | 反轉容器中的內容 |
public int length() | 返回字符串長度 |
public String toString() | 通過?toString ?可以把?StringBuilder ?轉化成?String |
(1) 綜合練習
編程題目:判斷字符串是否為對稱字符串
題目描述:
請編寫一個 Java 程序,實現判斷用戶輸入的字符串是否為對稱字符串(即回文串)。對稱字符串是指從左到右讀和從右到左讀完全相同的字符串,例如 "abcba"、"aaa" 是對稱字符串,而 "abc"、"abbaa" 不是對稱字符串。
要求:
- 程序需通過鍵盤接收用戶輸入的一個字符串(假設輸入不包含空格)
- 使用字符串反轉的方式判斷該字符串是否為對稱字符串
- 輸出判斷結果,格式為:"當前字符串是對稱字符串" 或 "當前字符串不是對稱字符串"
public class test2 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("請輸入一個字符串");String str = sc.next();String result = new StringBuilder().append(str).reverse().toString(); //不太理解if (str.equals(result)) {System.out.println("當前字符串是對稱字符串");} else{System.out.println("當前字符串不是對稱字符串");}}
}
① reverse()
?方法
定義:
StringBuilder
?和?StringBuffer
?中的?reverse()
?是無參數方法(方法聲明為?public StringBuilder reverse()
)結論:括號里不能添加任何參數,否則會編譯錯誤
② toString()
?方法
大多數情況下:
toString()
?也是無參數方法(例如?StringBuilder
、Object
?類中的定義都是?public String toString()
),此時括號里不能加參數。
3. Stringjoiner
構造方法2+成員方法3:
方法名 | 說明 |
---|---|
public StringJoiner(間隔符號) | 創建一個?StringJoiner ?對象,指定拼接時的間隔符號 |
public StringJoiner(間隔符號,開始符號,結束符號) | 創建一個?StringJoiner ?對象,指定拼接時的間隔符號、開始符號、結束符號 |
public StringJoiner add(添加的內容) | 添加數據,并返回對象本身,支持鏈式調用 |
public int length() | 返回拼接后最終字符串的長度(字符出現的個數) |
public String toString() | 返回拼接形成的最終字符串 |
4. 字符串原理
(1)?內存原理
直接賦值會復用字符串常量池中的·
new出來不會復用,而是開辟一個新的空間
(2)?字符串拼接原理
拼接無變量 ,編譯后就是拼接后的結果,會復用串池里的字符串
拼接有變量 , 每一行拼接的代碼,都會在內存中創建心得字符串,浪費空間資源