Вопрос по map, java – Проверьте, все ли значения на карте равны

2

Мне нужно проверить, все ли значения на карте равны. У меня есть метод для выполнения этой задачи, но я хотел бы использовать библиотеку или нативные методы. Ограничения: библиотеки Java 5 + Apache Commons.

public static boolean isUnique(Map<Dboid,?> aMap){

boolean isUnique = true;
Object currValue = null;
int iteration = 0;

Iterator<?> it = aMap.entrySet().iterator();

while(it.hasNext() && isUnique){
    iteration++;
    Object value = it.next();
    if(iteration > 1){
        if (value != null && currValue == null ||
            value == null && currValue != null ||
            value != null && currValue != null & !value.equals(currValue)) {
            isUnique = false;
        }
    }
    currValue = value;
}
return isUnique;
}
Вы можете улучшить свой собственный метод, хотя. Код, предложенный a_horse_with_no_name, выполнит эту работу, но он создаст отдельный HashSet и, возможно, скопирует все ваши значения в этот HashSet в процессе. Все, что вам нужно сделать, это получить первый элемент и сравнить его со всеми другими элементами (цикл foreach будет полезен здесь), пока вы не найдете тот, который делаетне равно значению первого. Как только вы найдете неравный элемент, вы можете выйти из цикла. Germann Arlington
Так твой код работает ?? Kick

Ваш Ответ

6   ответов
0

как насчет

return (new HashSet(aMap.values()).size() == 1)
1

//think in a more proper name isAllValuesAreUnique for example
    public static boolean isUnique(Map<Dboid,?> aMap){
         if(aMap == null)
               return true; // or throw IlegalArgumentException()

         Collection<?> c = aMap.getValues(); 
         return new HashSet<>(c).size() <= 1;
    }
1

что первоначальные вопросы требуют решений в Java 5, но в случае, если кто-то еще ищет ответ на этот вопрос, не ограничивается Java 5, здесь используется подход Java 8.

return aMap.values().stream().distinct().limit(2).count() < 2
9

Как насчет этого примерно так:

Set<String> values = new HashSet<String>(aMap.values());
boolean isUnique = values.size() == 1;
Может бытьvalues.size() <= 1 было бы лучше. Я думаю, что пустая карта также может рассматриваться как решение. @DavidEhrmann: это может быть очень медленно в зависимости от реализацииequals() а такжеhashCode() NeplatnyUdaj
@KevinBowersox Тогда они явно не равны. Hunter McMillen
@DavidEhrmann: это не будет медленнее, чем код в вопросе, который я предполагаю. a_horse_with_no_name
@NeplatnyUdaj: Я тоже об этом думал, но думаю, что лучше простоif (aMap.isEmpty()) return true в качестве предварительного условия в методе. a_horse_with_no_name
1
public static boolean isUnique(Map<Dboid,?> aMap) {
    Set<Object> values = new HashSet<Object>();

    for (Map.Entry<Dboid,?> entry : aMap.entrySet()) {
      if (!values.isEmpty() && values.add(entry.getValue())) {
        return false;
      }
    }

    return true;
}

что он позволяет сэкономить память, если на карте много отличий. Для частного случая пустогоMap вы можете выбратьfalse в качестве возвращаемого значения измените его соответствующим образом для вашей цели.

Или даже лучше безSet (если твойMap не содержит нулевых значений):

public static boolean isUnique(Map<Dboid,?> aMap) {
    Object value = null;

    for (Object entry : aMap.values()) {
      if (value == null) {
        value = entry;
      } else if (!value.equals(entry)) {
        return false;
      }
    }

    return true;
}
1

хранить значения вДвунаправленная карта и всегда имейте это свойство.

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