将数字字符串拆分成数组

3
我有一个字符串(10325710),我想将它拆分成一个数组。在我将字符串拆分成数组后,该数组将为{1,0,3,2,5,7,1,0}。请注意,字符串中有两个1和两个0。我不想拆分'1'和'0'。因此,我希望得到的数组是{10,3,2,5,7,10}
有什么建议吗?
我的C#代码:
string myNumber = "10325710";
string[] myArray = myNumber.Select(p => p.ToString()).ToArray();

1
你怎么知道数组中没有32?还是说只是没有0? - Dan Puzey
1
我猜字符串中只有1到10的值。虽然应该明确说明。 - Spook
输出数组中允许的有效整数范围是什么? - Bojan Komazec
哎呀...我的数字里只有1到10。 - Nerdynosaur
4个回答

16
int[] nums = myNumber.Replace("10", "A")
                     .Select(c => Convert.ToInt32(c.ToString(), 16))
                     .ToArray();

基本上是用"A"替换"10",然后将每个字符视为一个16进制数。


1
@Spook 不确定您所说的“可扩展”是什么意思。这个问题听起来像是他们只需要解析1-10的数字。此外,通常情况下,您会对一个答案进行负投票,是因为它是错误的,而不是因为您认为它不完美;) - Eren Ersönmez
@ErenErsönmez 这里可能更适合使用可维护性这个词。通常情况下,你可以用数千种方法解决问题,因此它的质量不能仅仅通过是否解决了问题来衡量,而是应该考虑它的可维护性(易于修复或修改)。假设OP还想解释20秒和30秒,所有其他解决方案都可以进行修改(大多数都很容易)以适应新的需求。这个需要从头开始重写(尽管它很短)。开阔思路非常好,技巧确实很酷。但我认为,这不是解决问题的方式。 - Spook
那么,如果提问者想要解释数百、数千、电话号码呢?所以你会因为它不能满足一些甚至不存在的要求而对一个完全有效的答案进行负评吗? :) - Eren Ersönmez
1
这是一个给出有效结果的答案,但在我看来本身不是有效的。顺便说一下,出于好奇,我对500k长度字符串的解决方案进行了分析。你的速度最快(400ms),消耗137M的RAM。Dominic的需要4.3秒和222M,Ken的需要5.1秒和712M,而我的(修改后)只需要1.2秒和61M。http://ideone.com/GC1lTk - Spook
从我的经验来看,你可以在 .Select() 之前添加 .AsParallel().AsOrdered() 来获得 一些 改进。不过我还没有考虑过如何并行化 String.Replace,这可能是一个有趣的练习。 - Eren Ersönmez

4

好的,简单介绍一下正则表达式:

Regex.Split(myNumber, @"(?!^)(?=[1-9])");

1

您可以很容易地手动完成它。

int i = 0;

int len = 0;
for (int j = 0; j < s.Length; j++)
    if (s[j] != '0')
        len++;

int[] result = new int[len];
int index = 0;
while (i < s.Length)
{
    if (i < s.Length - 1 && int.Parse(s[i + 1].ToString()) == 0)
    {
        result[index++] = int.Parse(s[i].ToString()) * 10;
        i += 2;
    }
    else
    {
        result[index++] = int.Parse(s[i].ToString());
        i++;
    }
}

return result;

1
我喜欢这种方法,如果需求改变,将来更容易调整 +1 - RhysW
2
你确定这段代码适用于这种情况吗?因为 if (i < myNumber.Length && myNumber[i + 1] == 0) 这一行应该会抛出 OutOfRangeException 异常。 - Soner Gönül
1
它甚至无法编译,因为 myNumber 似乎是字符串,而 int.Parse(myNumber[i]) 不适用于字符。它也不能产生正确的结果。 - Tim Schmelter
看起来现在可以工作了。我取消了我的反对,但是我会使用int.Parse(myNumber[i].ToString())而不是(int)Char.GetNumericValue(myNumber[i]) - Tim Schmelter
@Spook:首先,这是可读性的问题,大多数人熟悉int.Parse而不是Char.GetNumericValue。此外,我认为后者会稍微昂贵一些。https://dev59.com/W3E85IYBdhLWcg3wQxLG - Tim Schmelter
显示剩余2条评论

1

声明:

var myArray=Regex.Matches(myNumber, @"1?\d").Cast<Match>().Select(p => p.ToString()).ToArray();

代码:

var myNumber="98765432101032571001210345610789";
var myMatches=Regex.Matches(myNumber, @"1?\d").Cast<Match>();
var myArray=myMatches.Select(p => p.ToString()).ToArray();

var whats_in_myArray="{ "+String.Join(", ", myArray)+" }";
Debug.Print("{0}", whats_in_myArray);

输出:

{ 9, 8, 7, 6, 5, 4, 3, 2, 10, 10, 3, 2, 5, 7, 10, 0, 12, 10, 3, 4, 5, 6, 10, 7, 8, 9 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接