0

我正在读取一个包含单词和名称的文件作为字符串。然后我把它分解成一个字符串数组。我想要做的是打印出也是单词的名称。单词仅用小写字母拼写,并且名称的首字母大写。因此,我想订购相同的大小写,以便 Ii 然后可以扫描数组并接收重复项。

所以我在 main.m 文件中的内容现在看起来像这样:

int main(int argc, const char * argv[])
{

@autoreleasepool {

    // insert code here...
    NSString *wordString = [NSString stringWithContentsOfFile:@"/usr/share/dict/words"
                                                     encoding:NSUTF8StringEncoding
                                                        error:NULL];

    NSArray *words = [wordString componentsSeparatedByString:@"\n"];

到处都说我应该使用 caseIntensiveCompare 方法,但我不明白它是如何工作的,或者在这种特殊情况下如何使用它。当我在谷歌上搜索它时,我得到的是:

NSString *aString = @"ABC";
NSString *bString = @"abc";

if ([aString caseInsesitiveCompare: bString]) == NSOrderedSame)
{
    //The strings are ordered equal
}

这似乎是错误的,首先因为我只有一个字符串,其次我希望它实际上对它们的字母进行相同的排序,而不是检查它们的排序是否相同。如果有人能给我一个提示如何做到这一点我将非常感谢!提前致谢 // Bjoern

4

2 回答 2

0

您可以尝试这样的事情(评论中的解释):

#import <Foundation/Foundation.h>

int main(int argc, char *argv[]) {
    @autoreleasepool {
        NSString *wordString = [NSString stringWithContentsOfFile:@"/usr/share/dict/words"
                                                             encoding:NSUTF8StringEncoding
                                                                error:NULL];

        // Get all the words by separating on newlines & convert to lowercase
        // Note: Assuming that the list doesn't contain duplicate strings
        // (i.e. the same word or name twice)
        // If it does, you should separate/add_to_set/get_all_objects/lowercase instead
        NSArray *words = [[wordString componentsSeparatedByString:@"\n"] 
                           valueForKey:@"lowercaseString"];

        // Create a counted set to keep track of duplicate strings
        NSCountedSet *bag = [[NSCountedSet alloc] initWithArray:words];

        // Create a mutable set to add only duplicates
        NSMutableSet *duplicates = [NSMutableSet setWithCapacity:0];

        // Iterate and add words that appear more than once in the counted set
        for (NSString *word in bag) {
            if ([bag countForObject:word] > 1) {
                [duplicates addObject:word];
            }
        }

        NSLog(@"Words: %lu | Unique words: %lu | Duplicates: %lu", words.count, bag.count, duplicates.count);
        // Output => Words: 235887 | Unique words: 234372 | Duplicates: 1515
    }
}

现在duplicates是一组既是单词又是名称的字符串(根据您的要求,即它们仅在大小写上有所不同)。您可以通过发送来获取单词数组[duplicates allObjects]

于 2013-11-11T21:17:15.460 回答
0

不确定我是否正确理解了您的问题。但是我的理解是,您需要首先将数组字符串存储在可变集中,然后在此基础上,您可以将现有的字符串与新的字符串进行比较,如下面的代码所示。这样您就可以过滤数组并识别重复的单词和名称。下面假设单词是包含字符串值的数组。因此,在处理进一步代码的基础上。

  NSMutableSet* existing = [NSMutableSet set];
  NSMutableArray* newArray = [NSMutableArray 
 array];
for (id object in words) {
if (![existing containsObject:[[object     
name]lowercaseString]) {
  [existing addObject:[[object 
  name]lowercaseString];
  [newArray addObject:object];
  }
else 
{
NSLog(@"duplicate name=%@", [object name]);
 }
 }
于 2013-11-11T13:22:30.903 回答