JAVA實驗三:獲取位數、判斷迴文
題目
編寫一個Java應用程式。使用者從鍵盤輸入一個整數,程式將判斷這個數是幾位數並輸出其位數,並判斷這個數是否是迴文數(是,則輸出“是迴文數”,否則輸出“不是迴文數”)。迴文數是指將該數含有的數字逆序排列後得到的數和原數相同,例如12121、3223都是迴文數。要求:定義兩個方法,一個用於獲取一個整數的位數,一個用於返回一個整數是否為迴文數。
答案1(推薦)
import java.util.Scanner; public class Main { static Scanner scan =new Scanner(System.in); static int input1=scan.nextInt(); static String input=String.valueOf(input1); public int number() { return input.length(); } public static String digits() { StringBuffer sb=new StringBuffer(input); sb.reverse(); String s=sb.toString(); System.out.println(s.length()); return s; } public static void main(String[] args) { if(digits().equals(input)==true) System.out.println("是迴文數"); else System.out.println("不是迴文數"); } }
答案2(不推薦)
import java.util.Scanner; public class Main { static Scanner scan=new Scanner(System.in); static int num=scan.nextInt(); public static int Sum(int num) { int no=num; int sum=0; while(no!=0) { no/=10; sum+=1; } //System.out.println(sum); return sum; } public static boolean include() { int []a=new int[Sum(num)]; int no=num; for(int i=0;i<Sum(num);i++) { a[i]=no%10; no/=10; } for(int i=0;i<Sum(num)/2;i++) { if(a[i]==a[Sum(num)-i-1]) continue; else { return false; } } return true; } public static void main(String[] args) { if(include()==false) { System.out.println(Sum(num)); System.out.println("不是迴文數"); } else { System.out.println(Sum(num)); System.out.println("是迴文數"); } } }
解析
看到這個題,會聯想到StringBuffer類中有一個倒置字串的函式:reverse(),值得注意的是,這個函式返回一個引用,也就是說,進行倒置之後原來的StringBuffer物件也就變了,所以一定要記得在寫的時候注意。
(一)StringBuffer講解
StringBuffer https://blog.csdn.net/fighting123678/article/details/83443919
String https://blog.csdn.net/fighting123678/article/details/83443685
1、StringBuffer類和String類的比較
(1)StringBuffer類和String類都是用來代表字串,但是StringBuffer與String內部實現方式不同。StringBuffer在進行字串處理時,不生成新的物件,對於StringBuffer物件的每次修改都會改變物件自身(這點是和String類最大的區別,String類所指物件的內容是不能修改的),在記憶體使用上要優於String類。所以在實際使用時,如果需要經常對一個字串進行修改,例如插入、刪除等操作的時候,使用StringBuffer要更加適合一些。
(2)StringBuffer是執行緒安全的,所以在多執行緒程式中也可以很方便的進行使用,但是程式的執行效率相對來說就要稍微慢一些。
(3)StringBuffer對toString方法進行了重寫,但是沒有對equals方法進行重寫,String類對toString和equals兩種方法都進行了重寫。
(4)StringBuffer和String屬於不同的型別,不能直接進行強制型別轉換。
(5)在StringBuffer類中存在很多和String類一樣的方法,這些方法在功能上和String類中的功能是完全一樣的。
2、StringBuffer物件的初始化
(1)初始化一個空StringBuffer物件
StringBuffer s = new StringBuffer();
(2)建立帶有內容的StringBuffer物件
StringBuffer s = new StringBuffer(“abc”);
這樣初始化出的StringBuffer物件的內容就是字串”abc”
3、StringBuffer物件和String物件之間的互轉
(1)正確方法
String轉StringBuffer
StringBuffer sb1 = new StringBuffer("123");
StringBuffer轉String
String s1 = sb1.toString();
兩者結合
String s = "abc";
StringBuffer sb1 = new StringBuffer("123");
StringBuffer sb2 = new StringBuffer(s); //String轉換為StringBuffer
String s1 = sb1.toString(); //StringBuffer轉換為String
(2)錯誤方法(StringBuffer和String屬於不同的型別,不能直接進行強制型別轉換)
StringBuffer s = "abc"; //賦值型別不匹配
StringBuffer s = (StringBuffer)"abc"; //不存在繼承關係,無法進行強轉
4、StringBuffer常用方法
append方法
public StringBuffer append(boolean b)
(1)作用是追加內容到當前StringBuffer物件的末尾,類似於字串的連線,呼叫該方法以後,StringBuffer物件的內容也發生改變
(2)例如:
StringBuffer sb = new StringBuffer(“abc”);
sb.append(true);
則物件sb的值將變成”abctrue”。
deleteCharAt方法
public StringBuffer deleteCharAt(int index)
(1)作用是刪除指定位置的字元,然後將剩餘的內容形成新的字串。
(2)例如:
StringBuffer sb = new StringBuffer(“Test”);
sb. deleteCharAt(1);
該程式碼的作用刪除字串物件sb中索引值為1的字元,也就是刪除第二個字元,剩餘的內容組成一個新的字串,所以物件sb的值變為”Tst”。
(3)StringBuffer中還存在一個功能類似的delete方法
public StringBuffer delete(int start,int end)
- 該方法的作用是刪除指定區間以內的所有字元,包含start,不包含end索引值的區間。
- 例如:
StringBuffer sb = new StringBuffer(“TestString”);
sb. delete (1,4);
該程式碼的作用是刪除索引值1(包括)到索引值4(不包括)之間的所有字元,剩餘的字元形成新的字串,則物件sb的值是”TString”。
insert方法
public StringBuffer insert(int offset, boolean b)
(1)作用是在StringBuffer物件中插入內容,然後形成新的字串。
(2)例如:
StringBuffer sb = new StringBuffer(“TestString”);
sb.insert(4,false);
該示例程式碼的作用是在物件sb的索引值4的位置插入false值,形成新的字串,則執行以後物件sb的值是”TestfalseString”。
reverse方法
public StringBuffer reverse()
(1)作用是將StringBuffer物件中的內容反轉,然後形成新的字串。
(2)例如:
StringBuffer sb = new StringBuffer(“abc”);
sb.reverse();
經過反轉以後,物件sb中的內容將變為”cba”。
setCharAt方法
public void setCharAt(int index, char ch)
(1)作用是修改物件中索引值為index位置的字元為新的字元ch。
(2)例如:
StringBuffer sb = new StringBuffer(“abc”);
sb.setCharAt(1,’D’);
物件sb的值將變成”aDc”。
trimToSize方法
public void trimToSize()
(1)作用是將StringBuffer物件的中儲存空間縮小到和字串長度一樣的長度,減少空間的浪費。
(二)題目解析
(1)因為StringBuffer對toString方法進行了重寫,但是沒有對equals方法進行重寫,String類對toString和equals兩種方法都進行了重寫。所以說,先對StringBuffer型別轉換之後,再換成String型別的,進行比較是否相同
(2)字串的長度是用length(),而不是size()。