【问题标题】:A better way of building a new string after swapping its contents交换内容后构建新字符串的更好方法
【发布时间】:2012-05-10 21:11:50
【问题描述】:

我正在操纵 ssn。 输入="123456789" 输出="896745123"

您从输入中取出前 3 位数字(即 123)并将其与后两位数字“89”交换,然后将“45”与“67”交换。下面是我使用 toCharArray 的代码。但我不喜欢它。这个方法(不是测试)可以同时被很多用户访问。我一直在寻找性能、可读性和交易安全性更好的解决方案。

感谢您的帮助。

@Test
    public void testSSNString(){

        String original="123456789";
        String result="896745123";
        char[] charResult=original.toCharArray();

        char temp=charResult[6];
        charResult[6]=charResult[0];
        charResult[0]=charResult[7];
        charResult[7]=charResult[1];
        charResult[1]=charResult[8];
        charResult[8]=charResult[2];
        charResult[2]=charResult[5];
        charResult[5]=charResult[4];
        charResult[4]=charResult[3];
        charResult[3]=temp;

        assertEquals(original.toCharArray(),charResult);

    }

【问题讨论】:

  • Tthis 完全是线程安全的并且性能极佳。没有任何解决方案可以击败您拥有的硬编码映射。

标签: java string thread-safety char stringbuilder


【解决方案1】:

就性能而言,您给出的方式本质上是您在 Java 中可以做到的最好的方式。使用数组比使用StringBuilder 更快。

为了提高可读性,我只做一些小的改动,比如为置换的输出创建一个新数组:

@Test
public void testSSNString() {
  String original = "123456789";
  String expected = "896745123";

  char[] in = original.toCharArray();
  char[] out = new char[9];
  out[0] = in[7];
  out[1] = in[8];
  out[2] = in[5];
  out[3] = in[6];
  out[4] = in[3];
  out[5] = in[4];
  out[6] = in[0];
  out[7] = in[1];
  out[8] = in[2];

  assertEquals(expected.toCharArray(), out);
}

【讨论】:

  • 如果您多次调用System.arrayCopy,性能可能会略有提升(同时代码也会减少)。
  • 甜蜜(这是“输入至少 15 个字符”)
  • 我想补充一点。我创建了一个方法并将此逻辑放入该方法中并返回“out.toString()”。 out.toString 返回地址而不是 "out" 的字符串表示形式。这是为什么?虽然 return new String(out);工作正常。
  • 对于char[] -> String 转换,使用new String(out)
  • @NayukiMinase。这就是我所做的。但我想知道为什么 char[]-> String 没有给我字符串而不是地址?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-04
  • 2012-05-31
  • 1970-01-01
  • 2012-10-04
相关资源
最近更新 更多