Вид на строке, которая может содержать число

Обратите внимание на разницу между выражением объекта и объявлением объекта.

  • val poodle = object: Dog { ... } является выражением объекта . Создает анонимный объект. Это эквивалентно написанию Dog poodle = new Dog() { ... } на Java.
  • object Poodle: Dog { ... } является объявлением объекта . Он создает одноэлементный объект и примерно эквивалентен созданию класса Java, который ограничен только одним экземпляром.

Документация Kotlin гласит, что свойства const val должны быть «верхнего уровня, или элементом объявления объекта, или объекта-компаньона». ( https://kotlinlang.org/docs/reference/properties.html#compile-time-constants ). Они недопустимы в объектных выражениях.

Следующее объявление объекта должно работать нормально:

object Poodle : Dog {
    private const val POODLE_FASHION = ...

    override fun walk() {
        ...
    }
}

Одна важная причина различия состоит в том, что выражение объекта не объявляет новый тип (хотя, в терминах Java, это приводит к анонимный класс).

  • val poodle = object: Dog { ... } создает переменную типа Dog. Нет такого типа, как Poodle.
  • object: Poodle: Dog { ... } создает объект типа Poodle. Это новый тип, который является подтипом Dog.

Это различие важно, потому что в Kotlin свойство const val всегда принадлежит типу. MyClass.MY_CONST_VAL является действительным, но доступ к нему как MyClass().MY_CONST_VAL является ошибкой и не будет работать. В результате свойство const val анонимного объекта всегда будет эффективно приватным для этого объекта.

Я не вижу технической причины, по которой было бы невозможно разрешить свойства const val для анонимных объектов (поля констант времени компиляции static final разрешены во внутренних классах Java), но их полезность была бы крайне ограничено, и это просто не является частью спецификации языка Kotlin.

72
задан Dave L. 19 September 2008 в 20:56
поделиться

1 ответ

Вот решение со следующими преимуществами перед Алгоритмом Alphanum:

  1. 3.25x времена быстрее (протестированный на данных из главы 'Эпилога' описание Alphanum)
  2. не используют дополнительную память (никакое строковое разделение, никакой парсинг чисел)
  3. начальные нули Процессов правильно (например, "0001" равняется "1", "01234" меньше чем "4567")
public class NumberAwareComparator implements Comparator<String>
{
    @Override
    public int compare(String s1, String s2)
    {
        int len1 = s1.length();
        int len2 = s2.length();
        int i1 = 0;
        int i2 = 0;
        while (true)
        {
            // handle the case when one string is longer than another
            if (i1 == len1)
                return i2 == len2 ? 0 : -1;
            if (i2 == len2)
                return 1;

            char ch1 = s1.charAt(i1);
            char ch2 = s2.charAt(i2);
            if (Character.isDigit(ch1) && Character.isDigit(ch2))
            {
                // skip leading zeros
                while (i1 < len1 && s1.charAt(i1) == '0')
                    i1++;
                while (i2 < len2 && s2.charAt(i2) == '0')
                    i2++;

                // find the ends of the numbers
                int end1 = i1;
                int end2 = i2;
                while (end1 < len1 && Character.isDigit(s1.charAt(end1)))
                    end1++;
                while (end2 < len2 && Character.isDigit(s2.charAt(end2)))
                    end2++;

                int diglen1 = end1 - i1;
                int diglen2 = end2 - i2;

                // if the lengths are different, then the longer number is bigger
                if (diglen1 != diglen2)
                    return diglen1 - diglen2;

                // compare numbers digit by digit
                while (i1 < end1)
                {
                    if (s1.charAt(i1) != s2.charAt(i2))
                        return s1.charAt(i1) - s2.charAt(i2);
                    i1++;
                    i2++;
                }
            }
            else
            {
                // plain characters comparison
                if (ch1 != ch2)
                    return ch1 - ch2;
                i1++;
                i2++;
            }
        }
    }
}
2
ответ дан 24 November 2019 в 12:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: