Простая головоломка Java Map

Какова наилучшая реализация этого универсального библиотечного метода?

public static <K, V> boolean containsEntry(
    Map<K, V> map, K key, V value) {}

Критерии оценки этой головоломки, как и большинства головоломок с кодированием, находятся в следующем порядке:

  1. Полнота
  2. Правильность
  3. Представление
  4. Красота
  5. Получение взноса PayPal

РЕДАКТИРОВАТЬ:

Что ж, раз уж он был закрыт, я мог бы опубликовать ответ. Думаю, это наверное оптимально:

  V valueForKey = map.get(key);
  return (valueForKey == null)
      ? value == null && map.containsKey(key)
      : valueForKey.equals(value);

Продуманное простое решение:

  return map.entrySet().contains(
      new AbstractMap.SimpleImmutableEntry<K, V>(key, value));

Он выделяет экземпляр, но дает реализации карты немного больше возможностей сделать что-то оптимальное.


person Kevin Bourrillion    schedule 06.11.2009    source источник
comment
Есть по крайней мере один лучший ответ. - Нет, это один "лучший" ответ по определению ...   -  person jjnguy    schedule 06.11.2009
comment
Кевин, если вы собираетесь задавать подобные вопросы, вам нужно установить несколько лучших правил. В противном случае это действительно не вопрос, на который можно дать достаточный ответ.   -  person jjnguy    schedule 06.11.2009
comment
Хорошо, я пытаюсь. См. Редактировать. Однако мне интересно ваше определение лучшего. Если четыре карты моей покерной руки - это 2 трефы, 3 трефы, туз пик, туз червей, какая лучшая пятая карта у меня может быть?   -  person Kevin Bourrillion    schedule 06.11.2009
comment
Что ж, я понимаю, что вы имеете в виду, но лучшей картой в этом случае будет туз.   -  person jjnguy    schedule 06.11.2009
comment
Мне любопытно различие полноты / правильности. Действительно ли неполное решение правильно?   -  person Laurence Gonsalves    schedule 06.11.2009
comment
Да, Лоуренс, почему-то я не думаю, что именно это решает все мои головоломки. :)   -  person Kevin Bourrillion    schedule 06.11.2009
comment
FWIW Я думаю, что такие вопросы действительно имеют место на сайте. Однако некоторые могут не согласиться.   -  person jjnguy    schedule 06.11.2009
comment
Я не знаю об этом. После того, как я добавил критерии, было подано еще как минимум 2 голоса за закрытие. Я думаю, настоящая проблема здесь в том, что я признал, что я уже знаю ответ - имея в виду, конечно, что я уже думаю, что знаю ответ. Я думаю, что большинство людей, похоже, не хотят, чтобы SO использовался таким образом.   -  person Kevin Bourrillion    schedule 06.11.2009
comment
Сайт не предназначен для вопросов такого типа. Но я думаю, что это может быть интересно немного обсудить.   -  person jjnguy    schedule 06.11.2009
comment
Ну тогда голосуйте за повторное открытие. :) Я нашел сообщение, в котором указано, что большинство пользователей приветствуют такие сообщения: meta.stackexchange.com/questions/25437/   -  person Kevin Bourrillion    schedule 06.11.2009
comment
Подождите минуту! Что-то меня беспокоит, что мои головоломки закрыты из-за того, что я не определил лучшее. В любом сообщении SO можно было бы использовать формулировку: «Как лучше всего сделать X»? А те, кто этого не говорит? Угадайте, что, спрашивающий по-прежнему будет использовать свое собственное совершенно неопределенное суждение о том, какой ответ, по его мнению, был лучшим. И становится еще хуже: избиратели тоже судят лучший! И никто не определяет лучшего! Невероятный! Как будто вы беспокоились, что у меня в голове был один точный конкретный ответ, и только этот ответ будет вознагражден. Но я просто подумал, что голосование пройдет в обычном режиме.   -  person Kevin Bourrillion    schedule 07.11.2009
comment
@Kevin, этот сайт временами может быть довольно непоследовательным. Посмотрите, как был решен этот лучший вопрос: stackoverflow.com/questions/1631414/   -  person Jim Ferrans    schedule 29.11.2009


Ответы (3)


public static <K, V> boolean containsEntry(Map<K, V> map, K key, V value) {
    returns map.containsKey(key) && isEqual(map.get(key), value);
}
private static boolean isEqual(Object a, Object b) {
    return a == null ? a == b : a.equals(b);
}

Скопировано из удаленного сообщения.

person Community    schedule 06.11.2009
comment
Было ли использование &, а не && преднамеренным? - person Laurence Gonsalves; 06.11.2009
comment
Если честно, не знаю ... Я прям скопировал из удаленного ответа. - person jjnguy; 06.11.2009
comment
был удаленный ответ? а вы это скопировали? Я немного запутался. В любом случае, это выглядит правильно, но не так эффективно, как могло бы быть. - person Kevin Bourrillion; 06.11.2009
comment
Да, кто-то ответил, а затем удалил ответ. Это выглядело правильно, поэтому я решил, что это все равно должна быть запись. - person jjnguy; 06.11.2009

public static <K, V> boolean containsEntry(Map<K, V> map, K key, V value) {
    returns map.containsKey(key) & isEquals(map.get(key), value);
}
private static boolean isEqual(Object a, Object b) {
    return a == null ? a == b : a.equals(b);
}

Вы также можете встроить метод isEqual.

person notnoop    schedule 06.11.2009

Предположительно, он должен вернуть boolean:

public static <K, V> boolean containsEntry(Map<K, V> map, K key, V value) {
    return map.containsKey(key) && map.get(key).equals(value);
}
person harto    schedule 06.11.2009
comment
Упс, исправил пост, спасибо. Мы хотели бы поддерживать все возможные значения key и value. - person Kevin Bourrillion; 06.11.2009