2

まったく同じ文字列が 2 つありますが、それらは等しいものとして比較されていません。1 つの文字列は変更可能な文字列で、もう 1 つは通常の文字列です。2 つの文字列が等しいかどうかを確認する if ステートメントがあります。2 つの文字列の出力は次のとおりです。

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 ドキュメントから変更可能な文字列を取得し、シングルトンの変更可能な配列からもう一方を取得しています。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");
        }
    }
}

SO 私は 2 つのアドレスを比較し、アドレスが同じである場合はプロパティを設定しています。これは常に true になることを確認しています。何か問題があるかどうかは誰にもわかりますか?なぜこれが起こっているのか、私には本当にわかりません。

4

4 に答える 4

6

文字列を比較する前に、文字列から空白文字を削除してみてください。以下を使用できます

firstString = [firstString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
secondString = [secondString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
BOOL stringsAreEqual = [firstString isEqualToString:secondString];
于 2013-04-08T16:32:11.167 に答える
3

isEqualToString:信頼できる方法を非難しないでください。

アドレス文字列の先頭または末尾にスペースを追加する必要があります。

stringByTrimmingCharactersInSet:先頭と末尾のスペースを削除するために使用します。

于 2013-04-08T16:22:04.750 に答える
1

文字列のクリーニングは科学というより芸術ですが、空白の場合はかなりうまく行うことができます:

// 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);
于 2013-04-08T16:36:56.797 に答える
0

文字列に目に見えない制御文字が含まれていますか?

string = [[string componentsSeparatedByCharactersInSet:[NSCharacterSet controlCharacterSet]] componentsJoinedByString:@""]
于 2021-01-20T07:45:06.003 に答える