2016-10-07 2 views
-1

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

Мой код выглядит следующим образом:

public static void intersection (ArrayList<Integer>s1, ArrayList<Integer>s2) { 
     HashSet <Integer> all = new HashSet<Integer>(); 
     HashSet <Integer> both = new HashSet<Integer>(); 

      for (int i=0; i<s1.size(); i++) 
       all.add(s1.get(i)); 

      for (int x=0; x<s2.size(); x++) { 
       if ((!(all.add(s2.get(x)))) && (((all.contains(s2.get(x)))))) { 
        both.add(s2.get(x)); 
         } 
      } 
      System.out.println("intersection - "+ both); 
} 

В ArrayLists содержат следующие значения:

s1 : 4 5 5 6 76 7 7 8 8 8 8 8

с2: 23 3 4 3 5 3 53 5 46 46 4 6 5 3 4

Однако выход состоит в следующем:

3, 4, 5, 6, 46

Мой выход желание:

4, 5, 6

Я понимаю, что он добавляет 3 и 46, потому что для ArraySet оба они являются элементами, присутствующими в s2 ArrayList, но не в s1. Однако я добавил all.contains(s2.get(x)), чтобы убедиться, что добавленное число присутствует в s1 или HashSet. Почему не работает?

+0

это для назначения, так что я должен напишите вот так. @ReutSharabani – ZeldaX

+1

взгляните на retainAll() или просто посмотрите здесь: http://stackoverflow.com/questions/8882097/is-there-a-way-to-calculate-the-intersection- из двух наборов – hasan

+0

, пожалуйста, правильно отформатируйте свой код. Некоторые комментарии: а) вы можете повторно использовать 'int i' во втором' for'-loop, b), почему вы добавляете все: от 's1' до' all'? Насколько я понимаю, вам нужно только пересечение, а не союз. – Turing85

ответ

3

Как об этом

public static void intersection (ArrayList<Integer>s1, ArrayList<Integer>s2) 
{ 
    HashSet <Integer> intersect = new HashSet<Integer>(); 

    for (int i=0; i<s1.size(); i++) 
    { 
     if (s2.contains(s1.get(i))) intersect.add(s1.get(i)); 

    } 

    System.out.println("intersection - "+ intersect); 

} 
2

Ваша программа может быть сведена к

Set<Integer> both = new HashSet<>(s1); 
both.retainAll(s2); 
System.out.println("intersection - " + both); 
0

Проще говоря, проверка на наличие в весь список, как вы здесь делаете не так, как вы могли бы уже добавлено это значение из списка s2.

if ((!(all.add(s2.get(x)))) && (((all.contains(s2.get(x)))))) { 

Необходимо проверить его на содержание s1. Вопрос в том, хотите ли вы назвать

s1.contains (s2.get(x)) 

или использовать возможно более эффективное решение, как преобразование s1 в TreeSet первый, или сортировка s1 и делать бинарный поиск