2015-06-06 78 views
1

我在嘗試格式化字符串時遇到了一些問題。所以基本上我得到了入隊和出隊,現在工作得很好。下面是代碼:Java如何將字符串的最後字符替換爲特定字符

public String toString(){ 
    String str = "["; 
    for(int i = front; i<= rear; i++){ 
     str += Q[i] + ","; 
    } 

    if(str.length() > 0 && str.charAt(str.length()-1)==','){ 
     str.substring(0, str.length()-1); 
    } 

    return str; 
} 

我想要的結果是一樣[1,2,3,4]。然而,我不知道如何取代最後的「,」「]」。目前的問題是它返回我[1,2,3,4,就是這樣。有任何想法嗎?提前致謝。

回答

4

變化:

for(int i = front; i<= rear; i++){ 
    str += Q[i] + ","; 
} 

到:

for(int i = front; i< rear; i++){ 
    str += Q[i] + ","; 
} 
str+=Q[rear] + "]"; 

也最好是使用StringBuilder.append()代替str +=,因爲字符串是immutable和每次使用str+=一次創建你的str對象的新實例

StringBuilder這將是:

StringBuilder str = new StringBuilder(); 
str.append("["); 
for(int i = front; i<= rear; i++){ 
    str.append(Q[i] + ","); 
} 
str.append(Q[rear] + "]"); 
+0

好吧,非常感謝。有用! – hyperfkcb

+0

@Denise不要忘了標記爲答案,如果它的工作 – Lrrr

+0

好吧,非常感謝! – hyperfkcb

1

如何:

String str = "["; 
for(int i = front; i< rear; i++){ 
    str += Q[i] + ","; 
} 
str += Q[rear] + "]"; 

當然,我會使用,而不是字符串連接StringBuilder的:

StringBuilder str = new StringBuilder(128); 
str.append('['); 
for(int i = front; i< rear; i++){ 
    str.append(Q[i]); 
    str.append(','); 
} 
if (rear > front) { 
    str.append(Q[rear]); 
} 
str.append(']'); 
return str.toString(); 
+0

我想這條線str + = Q [i] +「]」;應該在for循環中?如果沒有,它會告訴我找不到我 – hyperfkcb

+0

@Denise你是對的。它只會在循環之前聲明'i'時才起作用。你可以用'str + = Q [rear] +「]」'替換它。 – Eran

+0

@Denise雖然我更喜歡StringBuilder版本,這更有效。請注意,它也處理'後方<=前方'的情況。 – Eran

1

使用string.replaceAll

string.replaceAll(",(?=[^,]*$)", "]"); 

string.replaceAll("(?m),$", "]"); 
+1

但是在str中使用這個我的其他「,」也將被替換。 – hyperfkcb

+0

不,它不會。它必須替換最後一個逗號。看到https://regex101.com/r/dN3rP0/1 –

+0

啊我看到沒問題。它也可以工作。非常感謝! – hyperfkcb

1
public String toString(){ 
    String str = "["; 
    for(int i = front; i<= rear; i++){ 
     if (i == rear) 
      str += Q[i] + ","; 
     else 
      str += Q[i] + "]"; 
    } 

    return str; 
} 
+0

非常感謝!它也可以工作。 – hyperfkcb

1

首先,不要使用拼接+=內循環

for (...){ 
    //... 
    resultString += newString 
    //... 
} 

創建字符串結果。通過這種方式,每次執行此代碼時,都會創建新的字符串,需要從resultString複製值並添加newString

而是使用適當的工具,如StringBuilder及其append方法。這樣可以防止每次都複製以前的結果(這可能需要一些時間)並將newString放在更大的緩衝區中。如果你想添加分隔符像,可以使用new StringJoiner(delimiter)(在Java中加入8),或者如果你想添加前綴和後綴的相似[]使用new StringJoinder(delimiter, prefix, suffix)所以使你的代碼更喜歡

StringBuilder sb = new StringBuilder(); 
for (...){ 
    sb.append(newString); 
} 
String result = sb.toString(); 

也。

所以,你的代碼可以看看或多或少是:

StringJoiner sj = new StringJoiner(",", "[", "]"); 
for(int i = front; i<= rear; i++){ 
    sj.add(Q[i]); 
} 
return sj.toString(); 

甚至

return IntStream 
     .rangeClosed(fron, rear) 
     .mapToObj(i->Q[i]) 
     .collect(Collectors.joining(",", "[", "]")); 
0

有新的,Java的8只風格:

Arrays.stream(Arrays.copyOfRange(Q, front, rear)).collect(Collectors.joining(",", "[", "]"); 

含蓄地創建將參數傳遞給Collectors.joining()的一個StringJoiner,分隔符前綴,後綴。 雖然沒有專門回答你的問題,但它解決了你面臨的實際問題。

+0

這裏的問題在於,OP使用'Q'中的'front' - 'rear'元素範圍。 – Pshemo

+0

@Pshemo:正確,我現在改了它 – zrvan

+0

爲什麼你想要創建單獨的範圍副本?您可以簡單地使用具有指定範圍的'IntStream',並將這個'int'值映射到'Q'元素,就像我在答案末尾顯示的那樣:http://stackoverflow.com/a/30682654/1393766 – Pshemo

相關問題