【问题标题】:algorithm to add randomly-generated NSStrings to NSMutableArray将随机生成的 NSStrings 添加到 NSMutableArray 的算法
【发布时间】:2023-03-11 16:11:01
【问题描述】:

目标是生成一个长度为 NSString 的字符并将每个字符串分配给一个数组。我被困在我需要用我的算法做些什么才能得到正确的结果。这是示例。我得到的结果是将相同的随机生成的字符串添加到我的数组中 26 次,而不是添加了 26 个不同的字符串。

我考虑过声明 26 个不同的 NSString 并将算法的每个结果分配给每个字符串,但这似乎效率低下。感谢您的帮助。

NSMutableString *string = @"expert";
NSUInteger strLength = [string length];
NSString *letterToAdd;
NSString *finishedWord;
NSMutableString *randomString = [NSMutableString stringWithCapacity: strLength];
NSMutableArray *randomArray = [[NSMutableArray alloc] init];

NSArray *charArray = [[NSArray alloc] initWithObjects: @"a", @"b", @"c", @"d", 
                         @"e", @"f", @"g", @"h", @"i", @"j", @"k", @"l", @"m", 
                         @"o", @"p", @"q", @"r", @"s", @"t", @"u", @"v", @"w", 
                         @"x", @"y", @"z", nil];

for (int a = 0; a < 26; a++) {
  for (int i = 0; i < strLength; i++) {

    letterToAdd = [charArray objectAtIndex: arc4random() % [charArray count]];
    if([randomString length] < strLength) {
      [randomString insertString: letterToAdd atIndex: i];
    }

    finishedWord = randomString;
  }

  [randomArray addObject: finishedWord];   
}

NSLog(@"Random Array count %i, contents: %@", [randomArray count], randomArray);

【问题讨论】:

    标签: objective-c cocoa random nsstring nsmutablearray


    【解决方案1】:

    我会这样做:

    #import "NSString+Shuffle.h"
    NSString * string = @"expert";
    NSUInteger strLength = [string length];
    NSString * alphabet = @"abcdefghijklmnopqrstuvwxyz";
    NSMutableSet * randomWords = [NSMutableSet set];
    
    while ([randomWords count] < 26) {
      NSString * newWord = [alphabet shuffledString];
      newWord = [newWord substringToIndex:strLength];
      [randomArray addObject:newWord];
    }
    NSLog(@"Random set count %d, contents: %@", [randomWords count], randomWords);
    

    然后,您需要在 NSString 上定义 shuffledString 的类别。此方法将简单地获取字符串中的字符并随机重新排列它们。使用 Google 可以很容易地找到体面的随机播放算法。

    我希望您对它的工作原理有基本的了解。我所做的唯一修改是使用 NSSet 而不是 NSArray,以及循环的条件是什么。消除了(极少)重复随机单词的可能性。

    编辑:因为我感觉很慷慨,这是一个基本的shuffledString 实现:

    //NSString+Shuffle.h
    @interface NSString (ShuffleAdditions)
    
    - (NSString *) shuffledString;
    
    @end
    
    //NSString+Shuffle.m
    #import "NSString+Shuffle.h"
    
    @implementation NSString (ShuffleAdditions)
    
    - (NSString *) shuffledString {
      NSMutableString * shuffled = [self mutableCopy];
      NSUInteger length = [shuffled length];
      for (int i = 0; i < (4*length); ++i) {
        NSString * randomChar = [shuffled subStringWithRange:NSMakeRange(arc4random() % (length-1), 1)];
        [shuffled appendString:randomChar];
      }
      return [shuffled autorelease];
    }
    @end
    

    【讨论】:

    • 要获得更快的性能,请使用字母表中的char*,然后随机播放那个。然后使用char*构建一个NSString
    • 除其他外,要对要洗牌的字符串进行大量索引。我认为在 NSString 上创建一个类别方法对于需要来说有点重量级。这是编写普通 C 函数的好时机,使用一个(静态)char* 保存源字符串,另一个写入,然后只需创建并返回一个 NSString (+stringWithUTF8String:) 内容为 null-终止的随机 C 字符串。快速简单,并最大限度地减少了对不需要的东西的 Objective-C 调用。
    • 感谢不同的策略。很有帮助。
    【解决方案2】:

    你应该每次都创建一个新的随机字符串:

    NSMutableString *string = @"expert";
    NSUInteger strLength = [string length];
    NSString *letterToAdd;
    NSString *finishedWord;
    //NSMutableString *randomString = [NSMutableString stringWithCapacity: strLength];
    NSMutableArray *randomArray = [[NSMutableArray alloc] init];
    
    NSArray *charArray = [[NSArray alloc] initWithObjects: @"a", @"b", @"c", @"d", @"e", @"f",
                          @"g", @"h", @"i", @"j", @"k", @"l", @"m", @"o", @"p", @"q", @"r", @"s",
                          @"t", @"u", @"v", @"w", @"x", @"y", @"z", nil];
    
    for (int a = 0; a < 26; a++) {
        NSMutableString *randomString = [NSMutableString stringWithCapacity: strLength];
    
        for (int i = 0; i < strLength; i++) {
    
                letterToAdd = [charArray objectAtIndex: arc4random() % [charArray count]];
                    //if([randomString length] < strLength) {
                        [randomString insertString: letterToAdd atIndex: i];
                    //}
    
            //finishedWord = randomString;
        }
    
        //[randomArray addObject: finishedWord];
        [randomArray addObject: randomString];
    }
    
    NSLog(@"Random Array count %i, contents: %@", [randomArray count], randomArray);
    

    【讨论】:

      【解决方案3】:

      您每次通过循环都将相同的对象添加到数组中,并在执行过程中覆盖它。你提到:

      我考虑过声明 26 个不同的 NSString 并分配每个 从算法到每个字符串的结果...

      这确实是您需要做的。将randomString 的初始化移动到循环中将解决您的问题(在每次循环迭代时获得一个新的NSMutableString,而不是使用单个对象)。将randomString的定义改为简单的类型定义:

      NSMutableString *randomString;
      

      然后在你的外循环中,添加这一行:

      randomString = [NSMutableString stringWithCapacity:strLength];
      

      您不需要更改任何其他代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-24
        • 1970-01-01
        • 1970-01-01
        • 2018-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多