【问题标题】:Sort string in alphabetical order in objective C [duplicate]在目标C中按字母顺序对字符串进行排序[重复]
【发布时间】:2014-12-08 20:44:14
【问题描述】:

我有一个标签、一个文本字段和一个按钮。用户在文本字段中引入一系列字母,例如“gcea”,按下按钮,标签文字变为“aceg”。

到目前为止我在 .h 中的内容

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@property (weak, nonatomic) IBOutlet UILabel *label;
@property (weak, nonatomic) IBOutlet UITextField *random;
- (IBAction)ok:(id)sender;

@end

到目前为止我在 .m 中的内容

- (IBAction)ok:(id)sender {


    NSString *order = self.random.text;
    NSInteger compare = order.length;
    NSString *corect = @"abc";

    // will insert all letters when it will actually work:)


    BOOL count = YES;

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

    {
        if([corect characterAtIndex:i] == [order characterAtIndex:i])

        {
            //do stuff?;


        }

    }


    self.label.text = [NSString stringWithFormat:@"%c", count];



}
@end

那么接下来我该怎么做呢?我的思考过程是我将我的“正确”字符串与用户逐个字符输入的内容进行比较,然后将结果打印在另一个字符串中。但是我不知道如何实际写这个,所以任何人都可以给我一些指点吗?

另外请不要使用任何预定义的方法,我想先更好地理解 bool 和 for 循环。

我是编程新手。

【问题讨论】:

  • 您似乎跳过了深潜,而是跳过了游轮的一侧,并要求有人向您扔救生圈-这可能会帮助您留下来漂浮直到你死于饥饿或暴露!
  • 如果你在编程方面的经验几乎为零,那么你就不会自己写一个分类。
  • 如果您不想使用内置方法进行比较,请查看基本排序算法(以及常见的编码面试问题)。你想匹配一个目标字符串,还是按字母顺序输入?那些是不同的。您比较(使用,而不是==)和存储排序的想法是一个开始。使用不同的字母(带变音符号、重音符号等)也会变得棘手,这就是人们使用内置本地化比较方法的原因。最后,看看代码结构。您真的想将这项工作锁定在按钮响应中吗?或者也许将其封装为自己的方法,以便您可以在其他地方重用它?
  • 你需要知道什么是 NSArray,它的文档在哪里。
  • 感谢 mc01 的回复,我会尝试以这种方式进行调查。我只想将输入和锁定按字母顺序排列成一个按钮响应(在我弄清楚后会尝试高级的东西)

标签: ios objective-c


【解决方案1】:

我不同意其他发帖者的观点,即您的问题与链接的帖子重复。

几件事:

首先:排序实际上是一个非常复杂的主题。我建议您阅读有关排序的 wiki 文章。像冒泡排序这样的简单排序算法很容易编写,但效率很低。他们的排序时间往往随着被排序元素数量的平方而增加,这对于排序较长的列表来说是个坏消息。尽管如此,学习一个简单的排序算法仍然是一个值得练习的练习。

第二个:NSString,它是可变的子类,NSMutableString,并不适合逐个字符地操作字符串。

创建一个单字符串数组的建议作为一个学习练习,甚至可能对 C 字符串进行排序也不错。

您可能希望从一个更简单的问题开始,例如对 C 数字数组进行排序。以下是一些示例代码:

//Create an array of mixed-up integers
int array[] = {73, 12, 135, 18, 200, 1, 416};


//an outer loop for indexing into the array starting at the first element and going to 
//the next-to-last item.
for (int outer = 0; outer < sizeof(array)-1; outer++)
{ 

  //An inner loop that starts one past the current outer loop, 
  //and goes to the end of the array
  for (int inner = outer+1; inner< sizeof(array); inner++);
  {
    //If the items at the outer and inner loop indexes are out of order, swap them
    if (array[outer] > array[inner])
    {
      int temp = array[outer];
      array[outer] = array[inner];
      array[inner] = temp;
    }
  }
}

上面的代码是一个糟糕的排序算法。对于包含 n 个元素的数组,它总是进行 n^2 次比较。但是,很容易理解它的作用。

在标准计算机科学术语中,这被称为 O(n squared) 性能,或者只是 n 平方性能,这是个坏消息。

您可以修改上面的代码来对 NSString 中的字符进行排序,但这会有点痛苦。正如其他人建议的那样,您必须将字符串分解为一个可变的 NSNumber 数组,该数组保存字符串中每个字符的值,然后使用上述代码对数字数组进行排序。

在 100 个字符的字符串上测试该排序算法。它看起来很快。然后给它一个 10,000 个字符的字符串。这将需要相当长的时间。那是因为它必须进行 10,000 x 10,000 或 1 亿次比较。

接下来查找诸如快速排序或外壳排序之类的排序。这些需要更多的工作来弄清楚和实施,但效率要高得多。如果我没记错的话,这两种排序算法通常都有 n * log(n) 的性能,这要好得多。

【讨论】:

    猜你喜欢
    • 2018-11-20
    • 1970-01-01
    • 2015-07-23
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    • 2021-05-08
    • 2017-10-04
    相关资源
    最近更新 更多