【问题标题】:Appending Strings in Java/C# without using StringBuffer.Append or StringBuilder.Append在 Java/C# 中附加字符串而不使用 StringBuffer.Append 或 StringBuilder.Append
【发布时间】:2011-04-05 22:06:32
【问题描述】:

在我最近参加的一次采访中,被问到的编程问题是这样的。编写一个函数,将两个字符串作为输入。输出应该是连接的结果。

条件:不应该使用 StringBuffer.Append 或 StringBuilder.Append 或字符串对象进行连接;即他们要我实现 StringBuilder 或 StringBuffer 的 Append 函数如何工作的伪代码实现。

这就是我所做的:

    static char[] AppendStrings(string input, string append)
    {
        char[] inputCharArray = input.ToCharArray();
        char[] appendCharArray = append.ToCharArray();
        char[] outputCharArray = new char[inputCharArray.Length + appendCharArray.Length];
        for (int i = 0; i < inputCharArray.Length; i++)
        {
            outputCharArray[i] = inputCharArray[i];
        }
        for (int i = 0; i < appendCharArray.Length; i++)
        {
            outputCharArray[input.Length + i] = appendCharArray[i];
        }
        return outputCharArray;
    }

虽然这是一个可行的解决方案,但是否有更好的处理方式?

【问题讨论】:

  • 你为什么打电话给ToCharArray()
  • @SLaks:归咎于一个新国家的面试紧张。 :-)

标签: c# java


【解决方案1】:

LINQ 合法吗?字符串 只是 可以被视为字符的枚举,因此它们可以与 LINQ 一起使用(即使涉及一些成本,请参阅 cmets):

string a = "foo";
string b = "bar";

string c = new string(a.AsEnumerable().Concat(b).ToArray());

或使用您的方法签名:

 static char[] AppendStrings(string input, string append)
 {
   return input.AsEnumerable().Concat(append).ToArray();
 }

【讨论】:

  • 没有足够的权限投票。但这很聪明!真棒聪明。
  • 您无需致电AsEnumerable
  • @Slaks:我尝试了不编译的 w/o - 唯一的替代方法是使用静态方法 string.Concat(),考虑到问题,这似乎超出了范围 - 但也许不是 string c = string.Concat(a,b) 是最简单的否则解决方案。
  • 我不认为在这里说“只是”是公平的......他们可以充当作为字符的枚举,但那不一样。此外,这可能会导致列表过大 - 它不是免费的。
  • 我收回;我没有意识到这个限制。
【解决方案2】:

您可以拨打CopyTo:

char[] output = new char[a.Length + b.Length];
a.CopyTo(0, output, 0, a.Length);
b.CopyTo(0, output, a.Length, b.Length);

return new String(output);

如果他们不喜欢,请致电.ToCharArray().CopyTo(...)

你也可以作弊:

return String.Join("", new [] { a, b });

return String.Format("{0}{1}", a, b);

var writer = new StringWriter();
writer.Write(a);
writer.Write(b);
return writer.ToString();

【讨论】:

  • +1。啊!该死的!我完全忘记了 ICollection.CopyTo
  • 除了事实证明,String 实际上并没有实现ICollection
【解决方案3】:

我会做类似以下的事情(为简洁起见省略了参数检查)

public static string Append(string left, string right) {
  var array = new char[left.Length + right.Length];
  for (var i = 0; i < left.Length; i++) {
    array[i] = left[i];
  }
  for (var i = 0; i < right.Length; i++) {
    array[i + left.Length] = right[i];
  }
  return new string(array);
}

【讨论】:

  • 这更像是我所做的(尽管我确实将它们冗余地转换为数组)。没有?
  • @Magic,它很接近,但你的方法分配了 3 个数组,而我的方法分配了 1 个数组。
【解决方案4】:

在 Java 中,您可以只使用 concat,它不使用 StringBuilder 或 StringBuffer。

String a = "foo";
String b = "bar";
String ab = a.concat(b);

Oracle 的 JDK 中 String.concat(String) 的来源。

public String concat(String str) {
int otherLen = str.length();
if (otherLen == 0) {
    return this;
}
char buf[] = new char[count + otherLen];
getChars(0, count, buf, 0);
str.getChars(0, otherLen, buf, count);
return new String(0, count + otherLen, buf);
}

【讨论】:

  • 不是在String上调用concat吗?
  • toCharArray() 也是如此。您不能在不使用任何 String 方法的情况下添加两个 String,因为至少需要它们才能访问它。如果你不能使用 concat 你可以写一个方法来做同样的事情。
  • 是的,你不能不使用任何 String 方法来编写。但是对于这个问题,op 仅限于不使用 concat 而不是其他方法。
【解决方案5】:

java默认支持“+”追加字符串

 String temp="some text";
   for(int i=0;i<10;i++)
{
  temp=temp+i;
}

或者

   temp=temp+" some other text"

【讨论】:

    猜你喜欢
    • 2010-12-17
    • 1970-01-01
    • 2013-03-24
    • 2012-03-03
    • 2011-01-02
    • 2013-01-04
    • 2015-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多