Я собирался предложить изменение структуры с кучи (k, v)
на кучу k
и словарь {k:[v]}
. Это превратит ваш код в:
k = heap[0]
return [(k,v) for v in hash[k]]
С:
hash = defaultdict(list)
heap = []
heappush(heap, (k, v))
станет:
heappush(heap, k)
hash[k].append(v)
heappop(heap)
станет: [1112 ]
k = heappop(heap)
v = hash[k].pop()
Как Вы описываете, @Override создает проверку времени компиляции, что метод переопределяется. Это очень полезно, чтобы удостовериться, что у Вас нет глупой проблемы подписи при попытке переопределить.
, Например, я видел следующую ошибку:
public class Foo {
private String id;
public boolean equals(Foo f) { return id.equals(f.id);}
}
Этот класс компиляции, как записано, но добавление тега @Override к равняется методу, вызовет ошибку компиляции, поскольку это не переопределяет, равняется методу на Объекте. Это - простая ошибка, но она может выйти из глаза даже закаленного разработчика
Это не только осуществляет проверку компилятора - хотя этого было бы достаточно для создания этого полезным; это также документирует намерение разработчика.
, Например, если Вы переопределяете метод, но не используете его нигде от самого типа, кто-то приходящий к коду позже может задаться вопросом, с какой стати это там. Аннотация объясняет свою цель.
нет - за исключением того, что это также улучшает удобочитаемость (т.е. в дополнение к любому индикатору Ваше использование IDE, это помогает определить это, метод переопределяет объявление в суперклассе)
Нет, Вы в значительной степени закрепили его.
@Override
говорит компилятор Ваш намерение : при метках метода @Override
Вы намеревались переопределить что-то от суперкласса (или интерфейс в Java 6). Хороший IDE услужливо отметит любой метод, который переопределяет метод без @Override
, таким образом, комбинация этих двух поможет гарантировать, что Вы делаете то, что Вы пытаетесь.