Objective-C,在NSString中创建每个唯一字符的NSArray

时间:2014-02-10 20:44:31

标签: objective-c nsstring nsarray

我已经四处搜索,发现了几个与此类似的问题,但不完全相同,我无法得到这些答案中给出的示例代码。我承认这很可能是因为我对Objective-C的无知阻碍了。我的情况是这样的:

我有一个包含各种字符的文本文件的NSString。字符串的长度可以根据文本文件中的内容而变化。我需要创建一个数组,给出字符串中的每个字符。

我已经尝试了5种不同的方法解决问题(其中三种来自本网站的答案),但我为此做出的每一项努力都导致了a)我无法解决的细分问题跟踪,b)数组在给出编译器警告时保持为NULL,或者c)数组保持为NULL而没有编译器警告。万一重要,我使用:gcc -framework Foundation -std = c99 TestCode.m -o TestProgram

很抱歉,此处没有具体的代码,因为我已经挫败了我所有失败的努力。我想这就是为什么你不应该尝试学习编程语言同时尝试学习你正在应用该语言的新主题的原因:)

有人会这么有帮助,给我一些片段与这里合作吗?

2 个答案:

答案 0 :(得分:6)

这就是你要做的。

  1. 将文件内容读入NSSString
  2. 枚举所有所有字符
  3. 将其添加到NSMutableSet
  4. 从集合中获取allObjects
  5. 在大致翻译为此

    的代码中
    // 1. Get the contents of the file 
    NSError *error = NULL;
    NSString *textFromFile = [[NSString alloc] initWithContentsOfFile:pathToFile
                                                             encoding:NSUTF8StringEncoding
                                                                error:&error];
    if (!textFromFile) {
        // handle error
    }
    
    // 2. Enumerate all the characters
    // (I'm enumerating composed characters to be able to support for example Chinese)
    NSMutableSet *characters = [NSMutableSet set];
    [textFromFile enumerateSubstringsInRange:NSMakeRange(0, textFromFile.length)
                                     options:NSStringEnumerationByComposedCharacterSequences
                                  usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
                                      // 3. Add them to a mutable set
                                      [characters addObject:substring];
                                  }];
    // 4. Get all the objects from the set (note that it's not sorted)
    NSArray *allCharacters = [characters allObjects];
    

答案 1 :(得分:1)

这是一个NSString类别,它将为字符串中的所有字符生成NSArray:

- (NSArray*)charactersAsArray
{
    NSMutableArray* array = [@[] mutableCopy];
    for (int i = 0; i < self.length; i++) {
        NSRange composedCharRange = [self rangeOfComposedCharacterSequenceAtIndex:i];
        NSString* character = [self substringWithRange:composedCharRange];
        if (character) {
            [array addObject:character];
        }
    }
    return array;
}

或者您可以使用的唯一字符:

- (NSArray*)uniqueCharactersAsArray
{
    NSMutableArray* array = [@[] mutableCopy];
    for (int i = 0; i < self.length; i++) {
        NSRange composedCharRange = [self rangeOfComposedCharacterSequenceAtIndex:i];
        NSString* character = [self substringWithRange:composedCharRange];
        if (character && ![array containsObject:character]) {
            [array addObject:character];
        }
    }
    return array;
}

你可以像这样使用它......

NSString* myString = @"disdiefgdsaéYsué8d9ieo";
NSArray* allCharactersArray = [myString charactersAsArray];
NSArray* uniqueCharactersArray = [myString uniqueCharactersAsArray];