Фиксированная точка на алгоритме сжатия, широко используемом в наше время

Ничего себе; я думаю, что выяснил ответ на свой собственный вопрос. Я просто не уверен, что это стоит того! :)

проблемой является бросок, не проверяется. Так, необходимо проверить его сами. Вы не можете только проверить параметризованный тип с instanceof, потому что параметризованная информация о типе недоступна во времени выполнения, будучи стертым во время компиляции.

, Но, можно выполнить проверку на каждом объекте в хеше с instanceof, и при этом, можно создать новый хеш, который безопасен с точки зрения типов. И Вы не вызовете предупреждений.

Благодаря mmyers и Esko Luontola, я параметризовал код, который я первоначально написал здесь, таким образом, он может оборачиваться в служебном классе где-нибудь и использоваться для любого, параметризовал HashMap. Если Вы хотите понять это лучше и не очень знакомы с дженериками, я поощряю просматривать историю редактирования этого ответа.

public static <K, V> HashMap<K, V> castHash(HashMap input,
                                            Class<K> keyClass,
                                            Class<V> valueClass) {
  HashMap<K, V> output = new HashMap<K, V>();
  if (input == null)
      return output;
  for (Object key: input.keySet().toArray()) {
    if ((key == null) || (keyClass.isAssignableFrom(key.getClass()))) {
        Object value = input.get(key);
        if ((value == null) || (valueClass.isAssignableFrom(value.getClass()))) {
            K k = keyClass.cast(key);
            V v = valueClass.cast(value);
            output.put(k, v);
        } else {
            throw new AssertionError(
                "Cannot cast to HashMap<"+ keyClass.getSimpleName()
                +", "+ valueClass.getSimpleName() +">"
                +", value "+ value +" is not a "+ valueClass.getSimpleName()
            );
        }
    } else {
        throw new AssertionError(
            "Cannot cast to HashMap<"+ keyClass.getSimpleName()
            +", "+ valueClass.getSimpleName() +">"
            +", key "+ key +" is not a " + keyClass.getSimpleName()
        );
    }
  }
  return output;
}

Это - большая работа, возможно для очень небольшого количества вознаграждения... Я не уверен, буду ли я использовать его или нет. Я ценил бы любые комментарии относительно того, думают ли люди, что это стоит того или нет. Кроме того, я ценил бы предложения улучшения: есть ли что-то лучше, что я могу сделать помимо броска AssertionErrors? Есть ли что-то лучше, что я мог бросить? Я должен сделать это контролируемой исключительной ситуацией?

6
задан Bruno Reis 20 August 2009 в 12:55
поделиться

2 ответа

Да! Это вариант проблемы quine .

  1. Пример использования gzip : http://groups.google.com/group/comp.compression/browse_thread/thread/c57c322e15c782aa/350d9fb166fdf11f

  2. Пример, в котором используется zip / unzip : http: // www.steike.com/code/useless/zip-file-quine/

4
ответ дан 17 December 2019 в 00:12
поделиться

Предупреждение: скорее педантичный ответ.

Во многих случаях D (f) = f (D определяется как декомпрессия). Однако сжатие не так точно определено. Для большинства алгоритмов сжатия разные реализации алгоритма сжатия дают разные выходные файлы (разного размера). Рассмотрим две программы, 1 и 2. Для полной совместимости необходимо, чтобы D1 (F) равнялось D2 (F) для всех допустимых F. Аналогично, необходимо, чтобы D2 (C2 (f)) == D2 (C1 ( F)) == D1 (C1 (F)) == D1 (C2 (F)) для всех допустимых F. Однако совершенно необязательно, чтобы C1 (F) == C2 (F), а это на самом деле редко

Таким образом, если вы действительно сжимаете такие quines, вы вряд ли получите один и тот же файл, если только вы не используете ту же программу, которая использовалась для его создания (что маловероятно,

3
ответ дан 17 December 2019 в 00:12
поделиться
Другие вопросы по тегам:

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