Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 更好的字符串操作代码_Java - Fatal编程技术网

Java 更好的字符串操作代码

Java 更好的字符串操作代码,java,Java,我正在寻找一个有效的(一行)字符串操作代码来实现这一点,可能是正则表达式。 我有一个字符串,例如“Calvin”,我需要将其转换为“/C/a/l/Calvin”。 i、 e.取前三个字符,用“/”分隔,然后追加原始字符串 这是我提出的代码,它工作得很好,只是在寻找一个更好的 String first = StringUtils.substring(prodName, 0, 1); String second = StringUtils.substring(prodName, 1, 2); Str

我正在寻找一个有效的(一行)字符串操作代码来实现这一点,可能是正则表达式。 我有一个字符串,例如“Calvin”,我需要将其转换为“/C/a/l/Calvin”。 i、 e.取前三个字符,用“/”分隔,然后追加原始字符串

这是我提出的代码,它工作得很好,只是在寻找一个更好的

String first = StringUtils.substring(prodName, 0, 1);
String second = StringUtils.substring(prodName, 1, 2);
String third = StringUtils.substring(prodName, 2, 3);

String prodPath = path + "/" + first + "/" + second + "/" + third + "/" + prodName + "/" ;

不要将正则表达式用于像这样简单的东西。您可能会节省几行,但在可读性方面会有很大损失。在阅读时,正则表达式通常需要一些时间来理解

String s = path;
for (int i = 0; i < 3; i++)
    s += prodName.substring(i,i+1) + "/";
s += prodName
String s=path;
对于(int i=0;i<3;i++)
s+=prodName.substring(i,i+1)+“/”;
s+=prodName

不使用正则表达式,而是简单的无条件拆分=)

另一种方法是使用
charAt()


可以使用积极的前瞻

public static void main(String[] args) {
    String s = "Calvin";
    System.out.println(s.replaceAll("(?=^(\\w)(\\w)(\\w))", "/$1/$2/$3/"));
}
O/p:


使用
String.charAt

    StringBuilder b = new StringBuilder (path);
    b.append ('/').append (prodName.charAt (0))
      .append ('/').append(prodName.charAt (1))
      .append ('/').append(prodName.charAt (2))
      .append ('/').append (prodName).append ('/');

您可以使用字符串生成器:

StringBuilder sb = new StringBuilder();
for (int i = 0; i < 3; i++) {
    sb.append("/").append(prodName.charAt(i));
}
sb.append('/').append(prodName);
StringBuilder sb=新建StringBuilder();
对于(int i=0;i<3;i++){
sb.append(“/”).append(prodName.charAt(i));
}
sb.append(“/”).append(prodName);
或者,您可以将所有代码放入循环:

int size = 2;
StringBuilder sb = new StringBuilder();
for (int i = 0; i <= size; i++) {
    if (i == 0)
        sb.append('/');
    sb.append(prodName.charAt(i)).append("/");
    if (i == size)
        sb.append(prodName);
}
int size=2;
StringBuilder sb=新的StringBuilder();

对于(int i=0;i您可以使用
MessageFormat.format()

我想我会把它包装起来以便于阅读

private String getProductionDirectoryPath(String baseDir, String name) {
    return MessageFormat.format("{0}/{1}/{2}/{3}/{4}/", baseDir, name.charAt(0), name.charAt(1), name.charAt(2), name);
}

当内置的
prodName.substring(0,1)
将执行相同的操作时,
StringUtils.substring(prodName,0,1)
有什么意义

无论如何,假设
prodName
始终至少有3个字符长(因为您没有为预期输出提供规则,如果不是的话),这是执行此操作的最快方法:

String prodPath = path + '/' +
                  prodName.charAt(0) + '/' +
                  prodName.charAt(1) + '/' +
                  prodName.charAt(2) + '/' +
                  prodName + '/';
通常,
char+char
是整数加法,而不是字符串串联,但是由于第一个值是
string
,并且
+
操作符是左关联的,所以所有
+
操作符都是字符串串联,而不是数字加法。

你说的有效,但你的意思可能是简洁。我怀疑这两个操作符是否应该是一个目标,所以你有一个不同的问题


为什么您关心这个字符串转换需要四行代码?您是否关心您心目中的某个操作(“创建转换字符串”)是否分布在四个Java操作中?您应该将四行Java提取到它们自己的方法中。然后,当您阅读需要该操作的代码时,您有一个与一个Java操作(调用方法)对应的概念操作(“创建转换字符串”)。您可以调用methid
createTransformedString
,使代码更加清晰。

这很容易阅读-也许可以使用StringBuilder,虽然一行代码会很简洁,但使用正则表达式可能不是最高效的CPU。不需要前导的
^
。此外,您删除了前导的
路径
和tra我正在从结果中提取
/
。@Andreas我正在处理OP的声明,我有一个字符串,例如“Calvin”,我需要将其转换为“/C/a/l/Calvin”。其余的可以很容易地推断出来。至于
^
,我必须相信你的话,因为我不在电脑旁。
()
你的生活有一种美answer@ScaryWombat这是Total Recall中的火星人;-)如果选择冗长的
StringBuilder
,您最好使用
“/”
而不是
“/”
。另外,您从结果中删除了前导的
路径
和尾随的
/
。当我看到循环中的
string+=string
时,我总是会畏缩。那么,为什么这比问题中的原始代码更好呢?这是4行代码,问题也是如此。此外,您还从结果中删除了前导的
路径
和尾随的
/
。相反,在这里使用简单的正则表达式可以获得可读性。@Andreas您对错误的事情感到畏缩。您从结果中删除了前面的
路径
和后面的
/
。将整个字符串拆分为一个字符串有点过分了,您不觉得吗?对于第二个选项,不需要使用
String.valueOf(ch)
,因为字符串串联可以很好地用于
char
值。此外,这两个选项都没有给出以路径+“\”
开头并以“\”结尾的原始结果。感谢您的回复,更新了我的答案,尽管还有更好的答案。至少现在它是正确的=)我的花了这么长时间:2730纳秒你的花了这么长时间:12629纳秒-在warmup@ScaryWombat如果您使用的是
“/”
,我会得到相同的性能。使用
“/”
时,您的速度更快(40ns vs 55ns)。我刚刚意识到,由于
路径
是一个
字符串
,因此
字符+字符
成为整数数学的问题不适用,因此我也可以使用
“/”
,以不太冗长的方式获得相同的性能。实际上,不太冗长。我想所有这些都证明了我需要一个更快的computer@ScaryWombati7-6700K 4GHz AlienWare X51游戏PC。对于Java开发来说有点过火,但对于游戏来说很好。您从结果中删除了前导的
路径和尾随的
/
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 3; i++) {
    sb.append("/").append(prodName.charAt(i));
}
sb.append('/').append(prodName);
int size = 2;
StringBuilder sb = new StringBuilder();
for (int i = 0; i <= size; i++) {
    if (i == 0)
        sb.append('/');
    sb.append(prodName.charAt(i)).append("/");
    if (i == size)
        sb.append(prodName);
}
MessageFormat.format("{0}/{1}/{2}/{3}/{4}/", baseDir, name.charAt(0), name.charAt(1), name.charAt(2), name);
private String getProductionDirectoryPath(String baseDir, String name) {
    return MessageFormat.format("{0}/{1}/{2}/{3}/{4}/", baseDir, name.charAt(0), name.charAt(1), name.charAt(2), name);
}
String prodPath = path + '/' +
                  prodName.charAt(0) + '/' +
                  prodName.charAt(1) + '/' +
                  prodName.charAt(2) + '/' +
                  prodName + '/';