劍指offer--替換空格 以及Java StringBuffer 和 StringBuilder 類
題目描述
請實現一個函式,將一個字串中的每個空格替換成“%20”。例如,當字串為We Are Happy.則經過替換之後的字串為We%20Are%20Happy。
1,題目中給出程式碼頭
public class Solution {
public String replaceSpace(StringBuffer str) {
}
}
題目中有StringBuffer類,
注意 StringBuffer 類支援的主要方法:
序號 | 方法描述 |
1 | public StringBuffer append(String s) 將指定的字串追加到此字元序列。 |
2 | public StringBuffer reverse() 將此字元序列用其反轉形式取代。 |
3 | public delete(int start, int end) 移除此序列的子字串中的字元。 |
4 | public insert(int offset, int i) 將 int 引數的字串表示形式插入此序列中。 |
5 | replace(int start, int end, String str) 使用給定 String |
所以,不能使用String 類中的replace(int i,String str)方法
public class Solution { public String replaceSpace(StringBuffer str) { // TODO Auto-generated method stub if (str == null || str.length() <= 0) { return null; } return str.replace(" ", "%20"); } }
參考:https://blog.csdn.net/lc013/article/details/53507329
下面的列表裡的方法和 String 類的方法類似:
序號 | 方法描述 |
---|---|
1 | int capacity() 返回當前容量。 |
2 | char charAt(int index) 返回此序列中指定索引處的 char 值。 |
3 | void ensureCapacity(int minimumCapacity) 確保容量至少等於指定的最小值。 |
4 | void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 將字元從此序列複製到目標字元陣列 dst 。 |
5 | int indexOf(String str) 返回第一次出現的指定子字串在該字串中的索引。 |
6 | int indexOf(String str, int fromIndex) 從指定的索引處開始,返回第一次出現的指定子字串在該字串中的索引。 |
7 | int lastIndexOf(String str) 返回最右邊出現的指定子字串在此字串中的索引。 |
8 | int lastIndexOf(String str, int fromIndex) 返回 String 物件中子字串最後出現的位置。 |
9 | int length() 返回長度(字元數)。 |
10 | void setCharAt(int index, char ch) 將給定索引處的字元設定為 ch 。 |
11 | void setLength(int newLength) 設定字元序列的長度。 |
12 | CharSequence subSequence(int start, int end) 返回一個新的字元序列,該字元序列是此序列的子序列。 |
13 | String substring(int start) 返回一個新的 String ,它包含此字元序列當前所包含的字元子序列。 |
14 | String substring(int start, int end) 返回一個新的 String ,它包含此序列當前所包含的字元子序列。 |
15 | String toString() 返回此序列中資料的字串表示形式。 |
但可以使用StringBuffer 類中的replace(int start, int end, String str) 使用給定 String
中的字元替換此序列的子字串中的字元
public class Solution1 {
public static void main(String[] args) {
String s = "1 2 3 4 5 6 7 8 9 0";
/**
* 注意方法replaceSpace(StringBuffer str) 裡面的變數型別是StringBuffer型別,
* 使用之前需要先進行轉換
*/
StringBuffer s1 = new StringBuffer(s);
s = replaceSpace(s1);
System.out.println(s);
}
static public String replaceSpace(StringBuffer str) {
for (int k = 0; k < str.length(); k++) {
char index = str.charAt(k);
if (index == ' ') {
str.replace(k, k + 1, "%20");//使用給定 String 中的字元替換此序列的子字串中的字元
//這裡用的巧妙,不用考慮變換後長度問題。
}
}
return str.toString();// StringBuffer轉換為String
}
}
注意:java.lang.StringBuffer的用法 參考:https://blog.csdn.net/u014523777/article/details/65440480
1、StringBuffer物件的初始化
StringBuffer物件的初始化不像String類的初始化一樣,Java提供的有特殊的語法,而通常情況下一般使用構造方法進行初始化。
例如:
StringBuffer s = new StringBuffer();
這樣初始化出的StringBuffer物件是一個空的物件,就是我犯的錯誤。
如果需要建立帶有內容的StringBuffer物件,則可以使用:
StringBuffer s = new StringBuffer(“abc”);
這樣初始化出的StringBuffer物件的內容就是字串”abc”。
需要注意的是,StringBuffer和String屬於不同的型別,也不能直接進行強制型別轉換,下面的程式碼都是錯誤的:
StringBuffer s = “abc”; //賦值型別不匹配
StringBuffer s = (StringBuffer)”abc”; //不存在繼承關係,無法進行強轉
StringBuffer物件和String物件之間的互轉的程式碼如下:
String s = “abc”;
StringBuffer sb1 = new StringBuffer(“123”);
StringBuffer sb2 = new StringBuffer(s); //String轉換為StringBuffer
String s1 = sb1.toString(); //StringBuffer轉換為String
、StringBuffer的常用方法
StringBuffer類中的方法主要偏重於對於字串的變化,例如追加、插入和刪除等,這個也是StringBuffer和String類的主要區別。
a、append方法
public StringBuffer append(boolean b)
該方法的作用是追加內容到當前StringBuffer物件的末尾,類似於字串的連線。呼叫該方法以後,StringBuffer物件的內容也發生改變,例如:
StringBuffer sb = new StringBuffer(“abc”);
sb.append(true);
則物件sb的值將變成”abctrue”。
使用該方法進行字串的連線,將比String更加節約內容,例如應用於資料庫SQL語句的連線,例如:
StringBuffer sb = new StringBuffer();
String user = “test”;
String pwd = “123”;
sb.append(“select * from userInfo where username=“)
.append(user)
.append(“ and pwd=”)
.append(pwd);
這樣物件sb的值就是字串“select * from userInfo where username=test and pwd=123”。
b、deleteCharAt方法
public StringBuffer deleteCharAt(int index)
該方法的作用是刪除指定位置的字元,然後將剩餘的內容形成新的字串。例如:
StringBuffer sb = new StringBuffer(“Test”);
sb. deleteCharAt(1);
該程式碼的作用刪除字串物件sb中索引值為1的字元,也就是刪除第二個字元,剩餘的內容組成一個新的字串。所以物件sb的值變為”Tst”。
還存在一個功能類似的delete方法:
public StringBuffer delete(int start,int end)
該方法的作用是刪除指定區間以內的所有字元,包含start,不包含end索引值的區間。例如:
StringBuffer sb = new StringBuffer(“TestString”);
sb. delete (1,4);
該程式碼的作用是刪除索引值1(包括)到索引值4(不包括)之間的所有字元,剩餘的字元形成新的字串。則物件sb的值是”TString”。
c、insert方法
public StringBuffer insert(int offset, boolean b)
該方法的作用是在StringBuffer物件中插入內容,然後形成新的字串。例如:
StringBuffer sb = new StringBuffer(“TestString”);
sb.insert(4,false);
該示例程式碼的作用是在物件sb的索引值4的位置插入false值,形成新的字串,則執行以後物件sb的值是”TestfalseString”。
d、reverse方法
public StringBuffer reverse()
該方法的作用是將StringBuffer物件中的內容反轉,然後形成新的字串。例如:
StringBuffer sb = new StringBuffer(“abc”);
sb.reverse();
經過反轉以後,物件sb中的內容將變為”cba”。
e、setCharAt方法
public void setCharAt(int index, char ch)
該方法的作用是修改物件中索引值為index位置的字元為新的字元ch。例如:
StringBuffer sb = new StringBuffer(“abc”);
sb.setCharAt(1,’D’);
則物件sb的值將變成”aDc”。
f、trimToSize方法
public void trimToSize()
該方法的作用是將StringBuffer物件的中儲存空間縮小到和字串長度一樣的長度,減少空間的浪費。
總之,在實際使用時,String和StringBuffer各有優勢和不足,可以根據具體的使用環境,選擇對應的型別進行使用
關於空格替換的整理版
方法:https://blog.csdn.net/qq_35334269/article/details/78961901?utm_source=blogxgwz2