2012-01-16 142 views
0

我是一名經驗豐富的C++程序員,但是是Java的新手。Java中的字符串終結符

我有一個算法,做一些字符串操作,我想終止在中間的字符串。

說,我想要做這樣的事情

String str("hello, world"); 
char[] str2 = str.toCharArray(); 
//pass str2 to some function 
myFunc(str2); 
... 
//inside myFunc, I decide to terminate str2 at position 3, so I did 
//str2[3] = 0 

//then it returns, how can I construct an String type variable from str2 that includes chars before the '\0'? 
//String str3 = new String(str2), doesn't work 

我可以寫我自己的C-喜歡strlen。但是我想知道在Java中使用它的優雅方式是什麼。

此外,它是很難找到有關char[]類型的文件。每當我使用Google時,我只能在「char」而不是「char []」上找到文檔。我想char []可能有方法喜歡substrstrlen

感謝您的建議!

+1

字符串在Java中是不可變的。你不能修改它們。他們也沒有終止字符。它們與'char'類型的數組也沒有關係。 – 2012-01-16 04:56:19

+0

特別注意\ 0是一個Java字符串中的合法字符! – 2012-01-16 04:59:04

+0

厄內斯特,謝謝你指出。 – 2012-01-16 05:29:02

回答

3

在Java中,char[]String是完全不同的。忘記C的關聯,就目前而言,他們並沒有任何關聯。 (爲了保持完整性,即String對象保存代表字符串final char[](和它的空值終止),正如你在你的例子一樣,你可以得到。不要那樣做,直到你的區別清楚。)你可以在字符串上調用所有的方法。但請記住,在Java中,String是不可變的 - 如果你有一個字符串,它總是總是是一樣的。您可以將一個新的String對象分配給一個變量,但舊字符串不會改變(當然,除非所有引用都消失了,並且它得到GC'd)。當你嘗試獲得一個新的字符串,如,這一點很重要。一旦你想出了你想要你的字符串多久,使用.substring()

所以,你的例子應該是這個樣子:

// Remember in Java no object is statically allocated. 
String str1 = "Hello, World"; 
int indexToCutAt = myFunc(str1); 
// We can't change str1, so we'll need to store the new string. 
String str2 = str1.substring(0,indexToCutAt); 
+0

謝謝,凱文。我知道你提到的幾點。我試圖編寫一個函數來操縱char []正是因爲我讀了這個String是不可變的,我知道我可以返回一個String對象,或者像你所建議的那樣返回一個int值,我認爲它非常好,我只是想確保Java沒有默認方法來構造一個字符串通過讀取一個NUL結尾的字符數組 – 2012-01-16 05:11:44

+0

@AlfredZhong那麼答案是否定的,對於包括字符串在內的任何東西,Java都不使用空終止,因爲它的數組有長度,你可以將'char'複製到一個新的,更短的數組或使用' substring'。 – Kevin 2012-01-16 05:22:36

+0

再次感謝凱文。我認爲直接返回一個String類型的子字符串將工作,但更少的內存效率。雖然我知道Java沒有垃圾收集,但它在某個時候會使用更多的內存。似乎返回和int需要空的char數組或數組只有一個元素。我認爲返回sbustring似乎是一個更好的解決方案。你有什麼意見?請原諒我是一個極客... – 2012-01-16 05:33:42

3

糾正我,如果我錯了,但看起來你只是試圖讓String的前三個字符。要做到這一點,你可以這樣做:

str.substring(0, 3); 

char[]不是它自己的階級。所有的數組是有長度,你可以檢索如下:

char[] myChars = new Char[5]; 
return myChars.length; // returns 5 

然而,你應該只處理事情String對象,一般不char[]String延伸CharSequence它是(作爲名字所暗示的)只是一個char原語序列,本質上是一個char[]

TL;博士:只需使用String方法

+0

問題是這個「3」是在「myFunc」中計算的,「myFunc」只是將str [3]設置爲0.如何在不寫入函數的情況下獲得這些信息來搜索0? – 2012-01-16 04:51:10

+1

@濃咖啡:實際上是相反的;如果您希望它傳遞到字符串的末尾,則不必傳遞'endIndex'。你總是需要指定'beginIndex'。有關詳細信息,請參閱[文檔](http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#substring(int))。 – 2012-01-16 04:53:22

+0

@Alfred Zhong:不知道你的類的約束/設計有點難以確定,但你應該能夠從myFunc返回「3」,並在你的子字符串調用中使用它,例如:'str.substring(0 ,myFunc(str2))'。你想達到什麼目的? – 2012-01-16 04:56:10

2

看一看,substring(int beginIndex)substring(int beginIndex, int endIndex),這將有助於:)

所以在你的函數中myFunc(str2); 返回你想休息的位置說pos

所以你要喜歡寫東西

int pos = myFunc(str2); 
String str3 = str2.substring(0,pos); 
+0

謝謝,桑傑,但如果我不想在myFunc中返回任何新對象會怎麼樣。我想用引用「str」來修改對象。那是possbile? – 2012-01-16 05:06:04

+0

@AlfredZhong對不起,我弄不明白你的意思:從函數中重新調用一個值有什麼不對嗎?另一種方法是聲明一個全局變量'pos',並在函數內部改變它的值 – COD3BOY 2012-01-16 05:15:41

+0

謝謝。我認爲它是非常好的,我只是好奇,如果有一種方式類似於C++。 – 2012-01-16 05:22:20