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 为真,字符串应该是“这是菠菜和芒果”的场景,注意添加的“和”与芒果。我可以直接在末尾添加它。

但问题是当所有的布尔值都为真时。字符串看起来像“这是菠菜、苹果、芒果和橙子”,这是我可以实现的。

我想让它看起来像“这是菠菜和苹果、芒果、橙子” 请注意,我只想在之后立即添加一次“和”,并注意芒果和橙子之前的逗号“,”。

我可能会得到这个,但是需要进行大量检查和大量不必要的 if/else 语句。

我在想我可以转身

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

我猜我可以使用某种功能来做到这一点。就像用“ , ”代替第二个和第三个“”一样。

你们能否让我知道这样的功能和一个例子来做到这一点。我认为在 CPP 中这是可能的。使用 strpos() 获取字符的位置,然后在某个数字后执行某些操作并替换字符串。或者让我知道是否有更好的方法。

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 等。

检查一下有多少布尔值是真的(如果你把它们放在一个数组中,把字符串放在另一个数组中会更容易),这样你就知道你的输出是什么了。字符串数组应该只包含唯一的水果而不是“和”。您将有一个名为 isand =false; 的 bool;遍历 bool 数组,如果你得到一个 true,则在其他数组中附加 " 和 " + 水果名称,并将另一个 bool 设置为 true。然后你知道其余的不要添加更多的“和”。

编辑:这很难理解,这里有一些代码(我的目标 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: @", "];
  }
}

同样,这只是客观的伪代码。我只是给你要点,而不是给你一些你应该粘贴到系统中的东西。这可能有错误的方法名称和内存泄漏。

此外,如果您开始处理复数和单数,那么事情会变得更加复杂,但不会太多。

干杯

于 2009-07-08T00:40:48.897 回答