我正在寻找一个简单的公共方法或运算符,它允许我重复一些字符串n次.我知道我可以使用for循环来编写它,但我希望在必要时避免使用循环,并且某处应该存在一个简单的直接方法.
String str = "abc";
String repeated = str.repeat(3);
repeated.equals("abcabcabc");
Run Code Online (Sandbox Code Playgroud)
相关:
repeat string javascript 通过重复给定次数的另一个字符串来创建NSString
编辑
当他们不是完全必要的时候我试着避免循环,因为:
即使它们隐藏在另一个函数中,它们也会增加代码行数.
读我的代码的人必须弄清楚我在循环中做了什么.即使它被评论并且具有有意义的变量名称,它们仍然必须确保它没有做任何"聪明"的事情.
程序员喜欢把聪明的东西放在for循环中,即使我把它写成"只做它想要做的事情",这并不排除有人出现并增加一些额外的聪明"修复".
他们经常容易出错.对于涉及索引的循环,往往会产生一个错误.
For循环经常重用相同的变量,增加了很难找到范围错误的机会.
For循环增加了bug猎人必须看的地方数量.
有没有更好的方法来获得这个结果?如果num的位数多于数字,则此函数失败,我觉得它应该在某个库中(如Integer.toString(x,"%3d")或其他东西)
static String intToString(int num, int digits) {
StringBuffer s = new StringBuffer(digits);
int zeroes = digits - (int) (Math.log(num) / Math.log(10)) - 1;
for (int i = 0; i < zeroes; i++) {
s.append(0);
}
return s.append(num).toString();
}
Run Code Online (Sandbox Code Playgroud) 例如,1, 2, 128, 256
输出可以是(16位):
0000000000000001
0000000000000010
0000000010000000
0000000100000000
Run Code Online (Sandbox Code Playgroud)
我试过了
String.format("%16s", Integer.toBinaryString(1));
Run Code Online (Sandbox Code Playgroud)
它为左边填充放置空格:
` 1'
Run Code Online (Sandbox Code Playgroud)
如何将0
s用于填充.我在Formatter中找不到它.还有另一种方法吗?
提前致谢.
PS 这篇文章描述了如何使用左0填充格式化整数,但它不适用于二进制表示.
我正在尝试使用以下格式获取完整LocalDate的周数:
dd.MM.yyy
Run Code Online (Sandbox Code Playgroud)
我还没有在Java 8 Date API中找到一个返回Week Number的函数,我试图创建一个算法,但它没有用.
对不起,如果这个问题已经提出,我已经深入搜索,没有任何内容.
现在,我知道:
String.format("%05d", price);
Run Code Online (Sandbox Code Playgroud)
将左边的零填充我的价格,因此25的价格将导致00025
如果我想将它们填充到右边怎么办,结果是25000?如何仅 使用String.format模式执行此操作?
为了提高性能,我使用VisualVM采样器分析了我的一个应用程序,使用的最小采样周期为20ms.根据分析器,主线程在该DecimalFormat.format()
方法中花费了近四分之一的CPU时间.
我使用DecimalFormat.format()
与0.000000
模式"转换" double
数字为字符串表示与正好六个小数位数.我知道这种方法相对昂贵并且被称为很多次,但我仍然对这些结果感到有些惊讶.
这种采样分析仪的结果在多大程度上准确?我将如何验证它们 - 最好不要求助于仪器分析仪?
DecimalFormat
对于我的用例,有更快的替代方案吗?推出自己的NumberFormat
子类是否有意义?
更新:
我创建了一个微基准来比较以下三种方法的性能:
DecimalFormat.format()
:单个DecimalFormat
对象重复使用多次.
String.format()
:多个独立呼叫.在内部,这种方法归结为
public static String format(String format, Object ... args) {
return new Formatter().format(format, args).toString();
}
Run Code Online (Sandbox Code Playgroud)
因此我预计它的表现非常相似Formatter.format()
.
Formatter.format()
:单个Formatter
对象重复使用多次.
此方法稍微不方便 - Formatter
使用默认构造函数创建的对象将format()
方法创建的所有字符串附加到内部StringBuilder
对象,该内部对象无法正确访问,因此无法清除.因此,多次调用format()
将创建所有结果字符串的串联.
为了解决这个问题,我提供了我自己的StringBuilder
实例,我在使用之前清除了一个setLength(0)
调用.
有趣的结果:
DecimalFormat.format()
是每次通话1.4us的基线.String.format()
在每次通话2.7便士时慢了两倍.Formatter.format()
在每次通话2.5us时,也慢了两倍.现在它看起来DecimalFormat.format()
仍然是这些替代品中最快的.
我有一个整数100
,我如何格式化它00000100
(总是8位数)?
已经回答了以十进制格式打印的整数的问题,但我正在寻找一种优雅的方法来对非十进制格式的整数(如二进制,八进制,十六进制)执行相同的操作.
创建这样的字符串很容易:
String intAsString = Integer.toString(12345, 8);
Run Code Online (Sandbox Code Playgroud)
将创建一个具有整数值12345的八进制表示的字符串.但是如何格式化它以使字符串具有10个数字,除了计算所需的零的数量和手动组装新的字符串.
一个典型的用例是创建具有固定位数(如16,32,...)的二进制数,其中一个人想要包含前导零的所有数字.
我正在使用一个int变量:
month = dp.getMonth() + 1;
Run Code Online (Sandbox Code Playgroud)
目前获得"2"的输出,当我执行以下操作时:
if (month<10){
month = '0'+month;
};
Run Code Online (Sandbox Code Playgroud)
我明白了:50.