1. Objective C / Говнокод #12884

    −112

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    +(NSString*)filterDigits:(NSString*)number
    {
        unichar zer = '0', nine = '9', cur;
        unsigned long l = [number length];
        NSMutableData *buf = [NSMutableData data];
        for (unsigned long j = 0; j!=l; j++)
        {
            cur = [number characterAtIndex:j];
            if (cur>=zer&&cur<=nine)
            {
                char digit = (char)cur;
                [buf appendBytes:&digit length:sizeof(char)];
            }
            
        }
        NSString* ret = [[[NSString alloc] initWithData:buf encoding:NSUTF8StringEncoding] autorelease];
        return ret;
    }

    Золотые у тебя руки парень. Но всеравно не оттуды растут (;

    Запостил: Psionic, 11 Апреля 2013

    Комментарии (12) RSS

    • А в чем задача была?
      Ответить
      • Выкинуть из телефонного номера все симоволы кроме цифр
        Ответить
        • Хорошо еще, что проверил все символы, а не находящиеся на определенном месте.
          Ответить
          • Ты посмотри код переноса блоков в моём iPad-приложении. В частности, поиск допустимых разрывов. Там ниндзякодинг ещё покруче ) Если вы ещё не расхреначили исходную группировки и именование, то оно находится в группе TabView, в каком-то из классов, отвечающих за обработку документа (они все назывались с маленькой буквы. Да, именно поэтому они (и только они) назывались с маленькой буквы - чтобы быстро найти)
            Ответить
        • Первое что пришло в голову:
          [[number componentsSeparatedByCharactersInSet: ... ] componentsJoinedByString:nil];
          Ответить
          • componentsSeparatedByCharactersInSet придется передать всю юникодную таблицу кроме "0"-"9"
            Для этой задачи лучше подойдет NSScanner
            Ответить
            • > всю юникодную таблицу кроме "0"-"9"
              Создаю таким образом:
              [[NSCharacterSet decimalDigitCharacterSet] invertedSet];

              И надеюсь, что Apple это оптмизировала :)
              Да, NSScanner конечно лучше.
              Ответить
    • Работает медленней чем оригинал:
      + (NSString *)filterDigits1:(NSString *)number
      {
          return [number stringByReplacingOccurrencesOfString:@"[^0-9]" withString:@"" options:(NSRegularExpressionSearch | NSForcedOrderingSearch) range:NSMakeRange(0, [number length])];
      }
      Ответить
      • Работает быстрее чем оригинал:
        + (NSString *)filterDigits2:(NSString *)number
        {
            NSMutableString *mutableNumber = [number mutableCopy];
            
            for (NSInteger index1 = [mutableNumber length] - 1; index1 > -1; index1--)
            {
                unichar character1 = [mutableNumber characterAtIndex:index1];
        
                if ((character1 < L'0') || (character1 > L'9'))
                {
                    NSInteger index2 = index1 - 1;
                    
                    for (;index2 > -1; index2--)
                    {
                        unichar character2 = [mutableNumber characterAtIndex:index2];
        
                        if ((character2 >= L'0') && (character2 <= L'9'))
                        {
                            break;
                        }
                    }
                    
                    [mutableNumber deleteCharactersInRange:NSMakeRange(index2 + 1, index1 - index2)];
                    
                    index1 = index2;
                }
            }
            
            return mutableNumber;
        }
        Ответить
        • Работает быстрее чем filterDigits2:
          + (NSString *)filterDigits3:(NSString *)number
          {
              NSMutableString *mutableNumber = [number mutableCopy];
              
              NSInteger mutableNumberLength = [mutableNumber length];
              
              unichar *characters = (unichar *)malloc(sizeof(unichar) * mutableNumberLength);
              
              if (!characters)
              {
                  @throw [NSException exceptionWithName:NSMallocException reason:@"Low memory" userInfo:nil];
              }
              
              [mutableNumber getCharacters:characters range:NSMakeRange(0, mutableNumberLength)];
              
              for (NSInteger index1 = mutableNumberLength - 1; index1 > -1; index1--)
              {
                  unichar character1 = characters[index1];
          
                  if ((character1 < L'0') || (character1 > L'9'))
                  {
                      NSInteger index2 = index1 - 1;
                      
                      for (;index2 > -1; index2--)
                      {
                          unichar character2 = characters[index2];
          
                          if ((character2 >= L'0') && (character2 <= L'9'))
                          {
                              break;
                          }
                      }
                      
                      [mutableNumber deleteCharactersInRange:NSMakeRange(index2 + 1, index1 - index2)];
                      
                      index1 = index2;
                  }
              }
              
              free(characters);
              
              return mutableNumber;
          }
          Ответить
    • Напишите, пожалуйста, что вам не нравится в этом коде?
      Почему всегда народ постит сюда код и не поясняет почему этот код - говнокод.
      Не все так прокачены. А так хоть можно будет понять ошибку и не совершать её.
      Ответить
      • Просто как дверь - подхода нет. Человек как бы говорит нам - я хорошо знаю язык, но я не умею принимать решения. У этой задачи есть два диаметрально противоположных метода решения: раз - отфильтровать все не цифры чарактерсетом (очень высокоуровневое решение, его быстро можно налобать, человек заработает себе пряник от манагеров на перфоманс эвалюейшене но по быстродействию в рантайме такое решение печалька) и два сделать и НСстринга си строку и перебрать ее своим методом, а на выходе возвратить новый НССтринг, такое решение реализуется дольше (особенно если стремится к максимальному быстродействию), но для скорости в рантайме такое решение веселее. А тут мы имеем какой-то гибрид из этих двух подходов - он всеравно не такой быстрый как решение два в рантайме и явно писался дольше чем первый.
        Ответить

    Добавить комментарий