[英]Construct a string from a repeated character
在Java中,我需要在編譯時構造一個n
為零且n
未知的字符串。 理想情況下,我會使用
String s = new String('0', n);
但是不存在這樣的構造函數。 CharSequence
似乎也沒有合適的構造函數。 所以我很想使用StringBuilder
構建自己的循環。
在我這樣做並冒被老板冒失的風險之前,有人可以建議:Java是否有標准的方法來做到這一點? 在C ++中, std::string
構造函數之一允許這樣做。
如果您不介意創建額外的字符串:
String zeros = new String(new char[n]).replace((char) 0, '0');
或更明確(可能更有效):
char[] c = new char[n];
Arrays.fill(c, '0');
String zeros = new String(c);
在性能方面, Arrays.fill
選項在大多數情況下似乎表現更好,但對於大型字符串尤其如此。 對於大型字符串,使用StringBuilder
相當慢,而對於小型字符串則使用高效。 使用replace
是一個很好的襯板,對於較大的字符串也可以執行,但不如filll
。
不同n值的微基准:
Benchmark (n) Mode Samples Score Error Units
c.a.p.SO26504151.builder 1 avgt 3 29.452 ± 1.849 ns/op
c.a.p.SO26504151.builder 10 avgt 3 51.641 ± 12.426 ns/op
c.a.p.SO26504151.builder 1000 avgt 3 2681.956 ± 336.353 ns/op
c.a.p.SO26504151.builder 1000000 avgt 3 3522995.218 ± 422579.979 ns/op
c.a.p.SO26504151.fill 1 avgt 3 30.255 ± 0.297 ns/op
c.a.p.SO26504151.fill 10 avgt 3 32.638 ± 7.553 ns/op
c.a.p.SO26504151.fill 1000 avgt 3 592.459 ± 91.413 ns/op
c.a.p.SO26504151.fill 1000000 avgt 3 706187.003 ± 152774.601 ns/op
c.a.p.SO26504151.replace 1 avgt 3 44.366 ± 5.153 ns/op
c.a.p.SO26504151.replace 10 avgt 3 51.778 ± 2.959 ns/op
c.a.p.SO26504151.replace 1000 avgt 3 1385.383 ± 289.319 ns/op
c.a.p.SO26504151.replace 1000000 avgt 3 1486335.886 ± 1807239.775 ns/op
創建一個n
大小的char數組並將其轉換為String:
char[] myZeroCharArray = new char[n];
for(int i = 0; i < n; i++) myZeroCharArray[i] = '0';
String myZeroString = new String(myZeroCharArray);
請參閱Apache Commons Lang中的StringUtils
沒有標准的JDK方式,但是Apache通用(幾乎是事實上的標准)具有StringUtils.repeat()方法,例如:
String s = StringUtils.repeat('x', 5); // s = "xxxxx"
或普通的舊字符串格式
int n = 10;
String s = String.format("%" + n + "s", "").replace(' ', '0');
System.out.println(s);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.