我有以下
<context:component-scan base-package="com.f.controller"/>
我希望结果是长度为2的数组,而是添加两个新的空字符串。
为什么会发生这种情况,如何在Join方法中避免它。 (我对斯普利特没有控制权。)
修改
答案 0 :(得分:4)
为什么会发生[...]?
String.Split Method (Char[])的文档告诉我们:
分隔符的每个元素都定义了一个单独的分隔符。如果两个分隔符相邻,或者在此实例的开头或结尾处找到分隔符,则返回数组中的相应元素包含空
这就是为什么你的结果数组中有空字符串(不是因为你在评论中写的连接方法)。
编辑: 在这个例子中,Split方法返回你的“输入”数组:
string.Join("~|~", new string[] { string.Empty, "2" }).Split(new string[] { "~|~" }, StringSplitOptions.None)
EDIT-2: 试试这个:
string.Join(ClientAPI.COLUMN_DELIMITER, new string[] { string.Empty, "2" }).Split(ClientAPI.COLUMN_DELIMITER, StringSplitOptions.None);
答案 1 :(得分:4)
您的代码的问题在于您为String.Split
方法提供了一个字符数组。现在它认为你想要将原始字符串除以任何给定的字符,在你的情况下&#39;〜&#39;和&#39; |&#39;。
你的测试字符串是&#34;〜| ~1&#34;所以他找到了三个分隔符:&#39;〜&#39;,&#39; |&#39;和&#39;〜&#39;再次。三个分隔符意味着四个字符串,因此你的三个空字符串。
你真正想做的事情是&#34;〜|〜&#34;作为一个完整的字符串,你可以通过调用:
来完成 joined_input.Split(new string[] { ClientAPI.COLUMN_DELIMITER }, StringSplitOptions.None)
(没有.ToCharArray)
如果您不想收到空条目,也可以使用StringSplitOptions.RemoveEmptyEntries
。
答案 2 :(得分:0)
只需使用StringSplitOptions.RemoveEmptyEntries
string.Join(new string(ClientAPI.COLUMN_DELIMITER.ToCharArray()), (new string[] { "1", "2" }))
.Split(ClientAPI.COLUMN_DELIMITER.ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
修改强>
无法返回原始空字符串。因为,你不知道哪一个是原创的。也许你可以用一个&#34;模式&#34;来替换空字符串。然后在恢复它们时用空字符串替换它们。
string pattern = "emptystringpattern";
string seperator = "||";
string[] input = new string[] { string.Empty,"1" };
for (int i = 0; i < input.Length; i++)
{
if (input[i] == string.Empty)
{
input[i] = pattern;
}
}
string joinedInput = string.Join(seperator, input);
var splits = joinedInput.Split(seperator.ToCharArray(),StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < splits.Length; i++)
{
if (splits[i] == pattern)
{
splits[i] = string.Empty;
}
}
此外,pattern
不应包含分隔符。
另一个选择是你可以在分割之前获得空字符串的计数,在分割过程之后,你可以根据计数再次添加数组。