【问题标题】:C# Splitting strings randomlyC# 随机分割字符串
【发布时间】:2020-11-22 18:31:29
【问题描述】:

我有一个这样的字符串:

string str = "ABCDEFGHI"

我想要这样的结果:

string str1 = "AB";
string str2 = "CDEF";
string str3 = "G";
string str4 = "HI";

这个想法是将一个字符串随机分割成一个随机长度的子字符串序列。

我尝试了以下方法:

public static string SplitString(string input)
    {
        string result = "";
        int j = 0;
        for (int i = 0; i < input.Length; i++)
        {
            Random random = new Random();
            j = random.Next(i+1, input.Length);
            string subString = input.Substring(i,j); //ERROR
            i = j-1;
            Console.WriteLine("New substring: " + subString);
            result = result + subString;
        }
        return result;
    }

看起来这种方法根本不正确,因为当我创建一个子字符串并且 i 索引大于 j 时,程序会出现异常。

有没有办法避免这个错误?

【问题讨论】:

  • 我的第一个观察是你的随机生成器不是随机的。在循环外创建一次Random 的实例,然后重复使用同一个实例。否则循环的所有迭代都可能生成相同的随机数。除此之外,i 怎么比j 大?调试代码时,确切的异常是什么,使用的值是什么?你从哪里得到这些值?如果您尝试获取超过字符串大小的子字符串,则只需在尝试获取子字符串之前检查该大小。

标签: c# string random


【解决方案1】:

Substring(Int32, Int32) 从索引 i 开始提取长度为 j 的子字符串,一旦 i+j >= input.Length - i 为真就会中断。

示例:应用于“ABCDEF”的 Substring(2,2) 应返回“CD”。在您的特定情况下,可能会有像 Substring(4,5) 这样的东西抛出异常,因为 String 没有足够的元素。 在某些时候,这个循环总是会导致异常。

关于使用 Substring 的更多细节可以在这里找到: https://docs.microsoft.com/en-us/dotnet/api/system.string.substring?view=netcore-3.1

一些你可以解决的问题:

  • 在 1 中生成一个随机数到 input.Length - i 而不是 1 到 input.Length
  • 设置 i = i + j - 1 而不是 i = j - 1

算法:

  1. 步骤
  • i = 0
  • 将 j 随机滚动到 0 到 (input.Length-1)
  • 从索引 i 开始输出 j 个首字母。
  • 设置 i = i + j - 1
  1. 步骤
  • i = j
  • 将 j 随机滚动到 0 到 (input.Length-1 - i)
  • 从索引 i 开始输出 j 个首字母。
  • 设置 i = i + j - 1
  1. 继续

【讨论】:

  • 谢谢,您的建议很有帮助!
猜你喜欢
  • 2011-08-09
  • 2015-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-21
  • 1970-01-01
  • 2022-09-28
  • 2015-01-21
相关资源
最近更新 更多