2

複雑な質問がありますが、皆さんにとっては非常に簡単かもしれません。

私は

NSMutableString = "This is spinach";

私は3つのブール値を持っています。コードは無視してください。適切な構文、関数を使用していません。

if (boolA) appendstring"and apples";

 if (boolB) appendstring"and mangoes";

 if (boolC) appendstring"and oranges";

すべてのブール値は果物に対応します。BOOL aが本当なら、私もマンゴーを持っていると言ってください!

とにかく、私の目標は、対応するブール値が真であり、非常に特殊な方法で存在する場合に、他のフルーツを追加して最初の文字列をフォーマットすることです。

BOOL Aがtrueの場合のシナリオは次のとおりです。文字列は、「これはほうれん草とマンゴーです」である必要があります。マンゴーに「and」が追加されていることに注意してください。最後に追加してすぐに追加できます。

しかし、問題は、すべてのブール値が真である場合です。ひもは「ほうれん草とりんごとマンゴーとオレンジです」のようになり、これが実現できます。

「これはほうれん草とリンゴ、マンゴー、オレンジです」のように見せたいのですが、直後に「And」を1回だけ追加し、マンゴーとオレンジの前にコンマ「、」を追加したいことに注意してください。

私はおそらくこれを得ることができますが、多くのチェックと多くの不要なif/elseステートメントがあります。

私は私がjusターンできると思っていました

"This is spinach and apples and mangoes and oranges" into 
"This is spinach and apples , mangoes , oranges".

これを行うために使用できる関数があると思います。2番目と3番目の「と」を「 」に置き換えるようなものです。

このような関数とその実行例を知っていただけませんか。これは、当時のCPPでは可能だったと思います。strpos()を使用してcharの場所を取得し、特定の数値の後に何かを実行して文字列を置き換えます。または、もっと良い方法があるかどうか教えてください。

4

4 に答える 4

2

非常に単純で素朴なアプローチは次のようになります。

NSMutableString* message = [NSMutableString stringWithCapacity:15];
[message setString:@"This is spinach"];

BOOL boolA = YES, boolB = NO, boolC = YES;

// add "and" if there are any fruits
if(boolA || boolB || boolC)
    [message appendString:@" and"];

if(boolA)
    [message appendString:@" apples,"];
if(boolB)
    [message appendString:@" oranges,"];
if(boolC)
    [message appendString:@" mangoes,"];

// remove last ","
if(boolA || boolB || boolC)
    [message deleteCharactersInRange:NSMakeRange([message length] - 1, 1)];

これにより、

This is spinach and apples, mangoes
于 2009-07-08T00:46:01.003 に答える
1

bool1 bool2 などの代わりに配列を使用する、よりクリーンなソリューションを次に示します。

いくつのブール値が true であるかを確認してください (それらを配列に入れ、文字列を別の配列に入れると簡単です)、出力がどうなるかがわかります。文字列の配列には、「and」ではなく、一意の果物のみを含める必要があります。isand =false; という bool を作成します。bool 配列を反復処理し、true を取得した場合は、" と " + フルーツ名を他の配列に追加し、他の bool を true に設定します。そうすれば、あとは「and」を追加しないことがわかります。

編集:理解するのが難しいです。ここにいくつかのコードがあります(私の目的のC構文は完璧ではないか、完璧に近いかもしれません。間違いを修正してコメントしてください:D)

bool isand=false;
NSMutableArray * strings = [NSMutableArray alloc] init];
NSMutableArray * bools = [NSMutableArray alloc] init];
NSMutableString = @"This is spinach";

//fill arrays with values

for (NSInt x=0; x<[string length]; x++) //could've used for in, but need to know which index to use in other array
{
if (b)
{
if (!isand)
{
[mystring appendString: @" and "];
isand=true;
}
[mystring appendString: [strings objectAtIndex: x];
}
}

私はおそらく多くの恐ろしい間違いを犯しましたが、うまくいけば、あなたはその考えを理解するでしょう:D

于 2009-07-08T00:48:20.317 に答える
1

別の解決策、今回は + [NSArray componentsJoinedByString:] を使用

NSMutableArray* fruits = [NSMutableArray arrayWithCapacity:3];

if(boolA)
    [fruits addObject:@"apples"];
if(boolB)
    [fruits addObject:@"oranges"];
if(boolC)
    [fruits addObject:@"mangoes"];

NSString* message;
if([fruits count] > 0)
    message = [NSString stringWithFormat:@"This is spinach and %@", [fruits componentsJoinedByString:@", "]];
else
    message = @"This is spinach";
于 2009-07-08T01:01:47.253 に答える
0

各ブール値を使用して、フルーツ文字列を配列に追加します。

items = [NSArray new];

if (boolA) [items append: @"apples"];
if (boolB) [items append: @"bannanas"];
if (boolC) [items append: @"cranberries"];

次に、配列の長さを調べて、どの言語(英語、フランス語など)でも「正しい」ことを行います。

疑似/壊れたObjcコード:

r = [NSMutableString string];
[r appendString: @"This is "];

if ([items length] == 1) {
  [r appendString: [items at: 0]];
}
if ([items length] == 2) {
  [r appendStringWithFormat: @"%@ and %@ ", [items at: 0], [items at: 1]] ;
}
if ([items length] > 2) {
  for (int i = 0; i < [items length]; i++) {    
    if (i == ([items length] - 1)) //if last
      [r appendString: @"and "];
    [r appendString: [items at: i]];
    [r appendString: @", "];
  }
}

繰り返しますが、これは単なる客観的な擬似コードです。システムに貼り付ける必要のあるものを提供するのではなく、要点を説明しているだけです。おそらく間違ったメソッド名があり、これでmemリークが発生します。

また、複数形や単数形を扱い始めると、事態はさらに複雑になりますが、それほど多くはありません。

乾杯

于 2009-07-08T00:40:48.897 に答える