2016-10-19 3 views
1

У меня есть следующая проблема, по которой я сравниваю два набора Hash (оба с значениями String в них). Мне нужно сравнить оба хэш-наборы, чтобы сохранить только те данные в наборе А, который также присутствует в множестве В:Сравнение значений ключей в двух наборах Java Hash

Набор A имеет следующие значения:

[YNVOTXAguONvMRiK8C6WzGAUlyf2] 
[YADfoWtZXSUtrMhN2JfhnS5lJYE3] 

Набор В имеет это значение:

[YADfoWtZXSUtrMhN2JfhnS5lJYE3] 

Как вы можете заметить, вторая клавиша набора A и ключ в наборе B идентичны. Однако, когда я сравниваю оба набора, используя код, приведенный ниже, результат я получаю false:

Log.e("boolean value", "" + chatList.get(i).userId.keySet().contains(userId.keySet())); 

Может кто-то пожалуйста, мне точку в правильном направлении?

+0

Вы не сравнивая ключи, но весь набор ключей. – tak3shi

+0

@ tak3ski Как вы сравниваете ключи? –

+0

Этот вопрос не должен содержать тега 'android' – Beloo

ответ

3

Чтобы вычислить общие элементы (пересечения) в двух сетах, вы можете использовать метод:

Set#retainAll(Collection c) 

В вашем примере проверить, если набор содержит Keyset, вы должны проверить для одного значения, так что это может быть:

Log.e("boolean value", "" + chatList.get(i).userId.keySet().contains(userId.keySet().iterator().next())); 
+0

Добро пожаловать :) –

1
contains(userId.keySet()) 

здесь вы проверить, если набор один имеет объект коллекции возвращенное userId.keySet() ...

, конечно, это вернет ложь.

1

Как указано в Krzysztof, вы можете использовать Set#retainAll(Collection c), чтобы получить пересечение двух комплектов. Однако это изменит существующий набор. Если вы не хотите, чтобы изменить существующий набор, вы можете использовать один из двух следующих подходов:

С Java 8:

Set<String> intersection = a.stream() 
          .filter(b::contains) 
          .collect(Collectors.toSet()); 

Без Java 8:

Set<String> intersection = new HashSet<>(a); 
intersection.retainAll(b); 
+0

Спасибо, работал :) –