0

新しいアプリに問題があります:

私は2つの文字列を持っています:

NSString *string1 = @"Il alla a la prison sur le champ" 
NSString *string2 = @"Il alllla a la prissson sur le champ"

私は配列を作ります:

NSArray *arrayReference = [string1 componentsSeparatedByString:@" "]; 
NSArray *arrayUser = [string2 componentsSeparatedByString:@" "]; 

配列を比較します:

NSMutableArray *arrayResult; 

for (int i = 0; i < arrayReference.count ; i++)
{
  NSString *stringReference = [arrayReference objectAtIndex:i]; 
  NSString *stringUser = [arrayUser objectAtIndex:i]; 

  if ([stringReference isEqualToString:stringUser])
  {
    [arrayResult addObject:stringUser]; 
  }
  else {
    [arrayResult addObject:[NSString stringWithFormat:@"<strong>%@</strong> <italic>%@</italic>",stringUser]; 
  }
}

それから私は得る:

NSString *stringResult = [arrayResult componentsJoinedByString:@" "]; 

だから私は印刷することができます:

Il alllla alla a la prisssson prison sur le champ

それは大丈夫です、私はユーザーの間違いを得ることができます。

しかし、配列の数が同じでない場合、問題が発生します。

私が持っている場合:

NSString *string1 = @"Il alla a la prison sur le champ";
NSString *string2 = @"Il fjdbfds alllla a la prison fdnfs sur le cahmp";

印刷したい:

Il fjdbfds alllla alla a la prison fdnfs sur le cahmp champ

NSStringにnilオブジェクトを挿入しようとしているため、for(...)を入力するとアプリがクラッシュします

助けてください、必要ならペイパルの寄付。

全てに感謝。

マーティンにとって、世界で最高の開発者:

文字列ユーザー:Il alla sur le champ a la prison juju、ildescendit au cabanon du saltimbanque; il l'appela par son nom、lui pris la main etluiparla。Il passa toutelajournéeauprésdelui、oubliant la nourriture et le sommeil、priant dieupourl'ameducondamnéetpriantlecondmanépourlasiennepropre。Il lui dit les meilleures verite qui sont lesplussimples。Il fut pere、frere、ami、eveque pourbenirseulement。Il lui enseigna tout、en le rassurant et enleconsolant。Cet homme allaitmourirdeseperer。La mort etait pour lui commeunabime。Debout et fremissant sur le seuil lugubre、il reculaitavechorreur。Il n'etait pas assez ignorant pour etreabsoluementindifferent。Sa condamnation、secousse profonde、avait en quelques sorte rompue ca et la autour de lui cette coison qui nous separe du lystere des selecteds et que nous appelonslavie。イリノイ州サンセセオーデホルスデセモンドアルセスブレッシュファタレス、エトネコヤイトケデテネブレ。L'eveque lui fit voiruneclarte。

文字列リファレンス:Il alla surlechampàlaprison、ildescendit au cabanon du saltimbanque; il l'appela par son nom、lui prit la main etluiparla。Il passa toutelajournéeauprèsdelui、oubliant la nourriture et le sommeil、priantDieupourl'âmeducondamnéetpriantlecondamnépourlasiennepropre。Il lui dit lesmeilleuresvérités、qui sont lesplussimples。Il futpère​​、frère、ami、évêquepourbénirseulement。Il lui enseigna tout、en le rassurant et enleconsolant。Cethommeallaitmourirdésespéré。Lamortétaitpourluicomeunabîme。Debouttefrémissantsurceseuillugubre、il reculaitavechorreur。Iln'étaitpasassezignorantpourêtreabsolumentindifférent。Sa condamnation、secousse profonde、avait enquelquesorterompuçàetlàautourdeluicette cloisonquinousséparedumystèredeschoosesetquenous appelonslavie。イリノイ州サンセセオーデホルスデセモンドパーセスブレーシュファタレス、エトネボイエイトクデステネブレ。L'évêqueluifitvoiruneclarté。

結果の文字列:Il alla sur lechampaàlaprisonjuju prisonildescendit au cabanon du saltimbanque ; il l'appela par son nom、lui pris prit la main etluiparla。Il passatoutelajournéeaupresauprèsdelui 、 oubliant la nourriture et le sommeil 、priant dieu Dieu pourl'amel'âmeducondmanécondamnéetpriantlecondamnépourlasiennepropre Il lui dit les meilleures veritevérités、qui sont lesplussimples 。Il futpère ​​、frère、père 、frèreami 、eveque évêquepourbenirbénirseulement _ _ _ Il lui enseigna tout、en le rassurant et enleconsolant。Cet homme allait mourir**desperer。 désespéré。Lamortetaitétaitpourluicomeunabîme 。_ _ Deboutetfremissantfrémissantsurleceseuil lugubre 、il reculaitavechorreur _ Iln'etaitn'étaitpasassezignorantpouretreabsoluementindifférentêtreabsolumentindifférent _ _ _ _ Sa condamnation、secousse profonde、avait en quelques_quelque_sorterompuçàrompuçàet làautourdeluicette cloisonquinousséparedumystèredeschoosesetquenous appelons laautourvie _Il thinkait sans cesse au dehors_ de ce monde parcesbrèchesfatales、 _et nevoyaitquedesténèbres。L'évêque_luicettecoisonqui nous separe du lystere des selecteds et que nous appelonslavie。イリノイ州サンセセオーデホルスデセモンドアルセスブレッシュファタレス、エトネコヤイトケデテネブレ。L'eveque lui fit voiruneclarte。 クラルテ

4

7 に答える 7

2

それ以外の:

for (int i = 0; i < arrayReference ; i++)

行う

NSInteger index = 0;
for (NSString * stringReference in arrayReference)
{
   if(index < [arrayUser count])
   {
       NSString * stringUser = [arrayUser objectAtIndex: index++];
       ...
       ...
       // do your comparison here
   } else {
       // you need to decide what to do if stringUser would be NULL
   }
}
于 2013-03-25T13:04:57.967 に答える
1

あなたはチェックしていi < arrayReferenceます。ただし、arrayReferenceは配列であるため、配列内のアイテムの数を確認する必要があります。

for (int i = 0; i < [arrayReference count] ; i++) {
    NSString *stringReference = [arrayReference objectAtIndex:i];
    if([arrayUser count]> i) {
         NSString *stringUser = [arrayUser objectAtIndex:i]; 
         if ([stringReference isEqualToString:stringUser])
         {
            [arrayResult addObject:stringUser]; 
         } else {
            [arrayResult addObject:[NSString stringWithFormat:@"<strong>%@</strong> <italic>%@</italic>",stringUser]; 
         }
    } else {
        //do you want to do something if the second array does not contain more words?
    }
}
于 2013-03-25T12:58:02.903 に答える
1

次の行で

 [arrayResult addObject:[NSString stringWithFormat:@"<strong>%@</strong> <italic>%@</italic>",stringUser];

ここでは2つのフォーマット指定子を指定(%@)しましたが、値は1つだけです。それがクラッシュの理由です。この行は次のようになります。

[arrayResult addObject:[NSString stringWithFormat:@"<strong>%@</strong> <italic>%@</italic>",stringUser,@"Some Text"];
于 2013-03-25T13:21:03.863 に答える
0

「arrayUser」のアプリクラッシュカウントの単純な理由は「arrayReference」のカウントよりも少なく、「arrayReference」のループを実行していて、「arrayUser」の値をフェッチしようとしています...

2つの配列を比較するには、次のスニペットを適用する必要があります

これは、動的配列を比較するのに役立ちます


for (int i = 0; i < [arrI count]; i++)
{
    for (int j = 0; j < [arrJ count]; j++)
    {
        if ([[arrJ objectAtIndex:j] isEqualToString:[arrI objectAtIndex:i]])
        {
            NSLog(@"%@",[arrI objectAtIndex:i]);
        }
    }
}

ここで、arrI=arrReferenceおよび

arrJ = arrUser

プログラミングをお楽しみください!

于 2013-03-25T13:02:07.740 に答える
0

これを試して

for (int i = 0; i < [arrayReference count] ; i++)
{

    NSString *stringReference = [arrayReference objectAtIndex:i];

    NSString *stringUser = @"";
    if (i<[arrayUser count]) {
         [arrayUser objectAtIndex:i];
    }

    if ([stringReference isEqualToString:stringUser])
    {
        [arrayResult addObject:stringUser];
    }
    else {

         NSString *tempString = @"";
        if ([stringUser length])
        {
            tempString = [NSString stringWithFormat:@"<strong>%@</strong> <italic>%@</italic>",
                          stringUser,stringReference];
        }
        else{
            tempString = [NSString stringWithFormat:@"<italic>%@</italic>",stringReference];
        }

        [arrayResult addObject:tempString];
    }
}
于 2013-03-25T13:16:27.537 に答える
0

これはあなたが探しているものですか?

NSString *string1 = @"Il alla a la prison sur le champ";
NSString *string2 = @"Il fjdbfds alllla a la prison fdnfs sur le cahmp";

NSMutableArray *array1 = [[string1 componentsSeparatedByString:@" "] mutableCopy];
NSMutableArray *array2 = [[string2 componentsSeparatedByString:@" "] mutableCopy];
NSMutableArray *goodArray = [NSMutableArray array];

while ([array1 count] > 0 && [array2 count] > 0) {
    // Check if first word of array2 occurs in array1: 
    NSString *word = [array2 objectAtIndex:0];
    NSUInteger idx = [array1 indexOfObject:word];
    if (idx == 0) {
        // correct word
        [goodArray addObject:word];
        [array1 removeObjectAtIndex:0];
        [array2 removeObjectAtIndex:0];
    } else if (idx == NSNotFound || idx > 4) {
        // extra word in array2
        [goodArray addObject:[NSString stringWithFormat:@"<strong>%@</strong>", word]];
        [array2 removeObjectAtIndex:0];
    } else {
        // missing word from array1
        word = [array1 objectAtIndex:0];
        [goodArray addObject:[NSString stringWithFormat:@"<em>%@</em>", word]];
        [array1 removeObjectAtIndex:0];
    }
}
// Remaining missing words:
for (NSString *word in array1) {
    [goodArray addObject:[NSString stringWithFormat:@"<em>%@</em>", word]];
}
// Remaining extra words:
for (NSString *word in array2) {
    [goodArray addObject:[NSString stringWithFormat:@"<strong>%@</strong>", word]];
}

NSString *stringCorrected = [goodArray componentsJoinedByString:@" "];
NSLog(@"%@", stringCorrected);

出力:

Il <strong>fjdbfds</strong> <strong>alllla</strong> <em>alla</em> a la prison <strong>fdnfs</strong> sur le <strong>cahmp</strong> <em>champ</em>

またはHTMLとしてレンダリング:

Il fjdbfds alllla alla a la prison fdnfs sur le cahmp champ

于 2013-03-25T14:21:20.710 に答える
0

最も簡単な方法は、最初の文字列をNSDictionaryに変換することです。値は気にしないので、ゼロに初期化します。

したがって、これは次のようになりますNSString *string1 = @"Il alla a la prison sur le champ"

Il -> 0, alla ->0 a -> 0, la -> 0 etc.

配列に変換した後、2番目の文字列を繰り返し処理します。新しいresultStringを作成します。

for(iterate elements through array)
{
   check if the element exists in dictionary
   if(!exists)
   {
      concatenate the result string with element that does not exist
   }

   concatenate the result string with current element

}

基本的な考え方をしました。対処する必要のある落とし穴はほとんどありません。たとえば、辞書に配列などと比較してより多くの文字列が含まれている場合はどうなりますか。

于 2013-03-25T16:11:53.220 に答える