代码之家  ›  专栏  ›  技术社区  ›  Chandler De Angelis

isEqualToString:未正确比较字符串

  •  2
  • Chandler De Angelis  · 技术社区  · 13 年前

    我有两个完全相同的字符串,但它们没有被比较为相等。一个字符串是可变字符串,另一个是普通字符串,我有一个if语句来检查这两个字符串是否相等。这两个字符串的输出如下:

    2013-04-08 09:09:31.555 Pin2Own[650:1303] 6447 E Crocus Dr
    2013-04-08 09:09:31.555 Pin2Own[650:1303] 6447 E Crocus Dr
    

    顶部是一个可变字符串,底部是正常字符串。我已经尝试将可变字符串转换为普通字符串,但我也遇到了同样的问题。我从NSXMLParser子类中的xml文档中获取可变字符串,另一个从singleton中的可变数组中获取。以下是NSXMLParser类的代码:

    - (void)parserDidStartDocument:(NSXMLParser *)parser
    {
        address = nil;
        zpid = nil;
    }
    
    - (void)parser:(NSXMLParser *)parser
    didStartElement:(NSString *)elementName
      namespaceURI:(NSString *)namespaceURI
     qualifiedName:(NSString *)qualifiedName
        attributes:(NSDictionary *)attributeDict
    {
        if ([elementName isEqualToString:@"street"])
        address = [[NSMutableString alloc] init];
    
        if ([elementName isEqualToString:@"zpid"])
        zpid = [[NSMutableString alloc] init];
    }
    
    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
    {
        if(address)
        [address setString:string];
    
        else if(zpid)
        [zpid setString:string];
    }
    
    - (void)parser:(NSXMLParser *)parser
     didEndElement:(NSString *)elementName
      namespaceURI:(NSString *)namespaceURI
     qualifiedName:(NSString *)qName
    {
        if ([elementName isEqualToString:@"street"])
        NSLog(@"%@", address);
    
        if ([elementName isEqualToString:@"zpid"])
        NSLog(@"zip id is: %@", zpid);
    }
    
    - (void)parserDidEndDocument:(NSXMLParser *)parser
    {    
        NSMutableArray *annotations = [[Data singleton] annotations];
    
        for (MapPoint *mp in annotations)
        {
            NSLog(@"%@", mp.fullAddress);
            if ([mp.fullAddress isEqualToString:address])
            {
                mp.zpid = zpid;
            }
            else
            {
                NSLog(@"Did not match address");
            }
        }
    }
    

    因此,我正在比较这两个地址,并在地址相同的情况下设置一个属性,我已经确保这将始终为真。有人看到有没有什么问题吗?我真的不知道为什么会发生这种事。

    4 回复  |  直到 13 年前
        1
  •  6
  •   Monolo    13 年前

    在比较字符串之前,请尝试修剪字符串中的空白字符。您可以使用以下内容

    firstString = [firstString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    secondString = [secondString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    BOOL stringsAreEqual = [firstString isEqualToString:secondString];
    
        2
  •  3
  •   Anoop Vaidya    13 年前

    不要责怪信任的人 isEqualToString: 方法

    您必须在任何地址字符串的前导或尾部添加一些空格。

    使用 stringByTrimmingCharactersInSet: 删除前导空格和尾部空格。

        3
  •  1
  •   Monolo    13 年前

    清理字符串是一门艺术,而不是一门科学,但在空白的情况下,它可以做得很好:

    // Various types of whitespace in the input string
    NSString *dirtyStr = @"   \tJoe\t Doe \n 42,    Main St. \n\rMetropolis    12345  ";
    
    // First trim the initial and final white space characters away
    NSString *trimmed  = [dirtyStr stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    
    NSLog(@"Trimmed: \"%@\"", trimmed);
    
    // Then remove repeated space characters in the middle (if consistent with your requirements)
    NSString *cleaned  = [trimmed stringByReplacingOccurrencesOfString:@"\\s+" withString:@" " options:NSRegularExpressionSearch range:NSMakeRange(0, trimmed.length)];
    
    NSLog(@"Cleaned: \"%@\"", cleaned);
    
        4
  •  0
  •   less    5 年前

    您的字符串是否包含不可见的控制字符?

    string = [[string componentsSeparatedByCharactersInSet:[NSCharacterSet controlCharacterSet]] componentsJoinedByString:@""]