Как заставить работать метод пересечения?

Итак, у меня есть этот метод, он не завершен, потому что не могу заставить его работать с тем набором, который у меня есть. Набор, у которого есть {0,1,2,7,8,9,10}. Я пробовал с if / else, но это дало мне ошибку исключения nullpointer. Должен ли я помещать объекты HashSet в массив, а затем сравнивать объекты? Пожалуйста, поделитесь своим мнением.

Это метод пересечения клиентов, где мне предоставлен файл HashSet.java, который содержит следующие методы. 1 - добавить метод 2 - содержит метод 3 - метод удаления

  public HashSet Intersect(HashSet s1)// only 1 & 2 should be printed
  {                
    HashSet intersect = new HashSet(buckets.length); 

    Iterator iter = this.iterator();   

    while(iter.hasNext())
    {
        intersect.add(iter.next());
    }

    Iterator iter1 = s1.iterator();
    while(intersect.contains(iter1.next()))
    {
        intersect.remove(iter.next());
    }

    return intersect;
  }

Возможный дубликат Как рассчитать пересечение двух множеств?

Naman 23.11.2018 21:42

Возможный дубликат Как рассчитать пересечение двух множеств?

Krease 23.11.2018 21:45

Я использую специально подготовленный HashSet.java. Я не могу использовать какие-либо доступные java.utils для решения проблемы, кроме использования данной проблемы HashSet. Мне как-то удалось с некоторой помощью на Stack заставить работать метод Union и метод различия, но пересечение так неуловимо. Надеюсь, кому-нибудь я смогу помочь.

Henry 23.11.2018 21:52

Переберите свой хэш-набор, используйте contains, чтобы проверить, содержит ли хэш-набор, переданный в качестве параметра, текущий элемент. Если это так, добавьте этот элемент в возвращаемый хэш-набор пересечения.

Aaron 23.11.2018 21:58
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
75
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Что касается вашей проблемы с NPE, вы должны сначала прочитать об итераторах. Действительно, вы всегда должны проверять, есть ли следующий элемент через .hasNext () (если это правда, вы можете безопасно вызвать .следующий()). Во-вторых, и тесно связанная с этим ваша логика недействительна, и проблемы возникают быстро во втором цикле, когда вы вызываете iter.next (), в то время как вы уже полностью повторили iter. Итак, следующий элемент, очевидно, равен нулю. Это определенно не то, что вы намеревались кодировать.

Я разобрался, но могу ошибаться в значениях. Значит, в коде что-то не так. Вот как это выглядит в основном методе. 'код' HashSet setI = setA.Intersect (setB); Итератор iterI = setI.iterator (); System.out.print ("\ nПересечение: {"); в то время как (iterI.hasNext ()) {System.out.print (iterI.next () + ""); } System.out.print ("}");

Henry 25.11.2018 23:21

Это мой метод пересечения, 'code' public HashSet Intersect (HashSet s1) // должны быть напечатаны только 1 и 2 {HashSet Intersect = new HashSet (buckets.length); Итератор iter1 = this.iterator (); в то время как (iter1.hasNext ()) {если (s1.contains (iter1.next ())) {correct.add ((iter1.next ())); }} возвратите пересечение; }

Henry 25.11.2018 23:42

Извините, но мой первоначальный ответ должен быть достаточно содержательным (другие комментарии также могут помочь). В самом деле, я вижу проблему в вашем втором комментарии, и она все еще связана с тем, как вы используете итераторы. Вы проверяете iter1.next () на s1, а затем добавляете iter1.next () для пересечения! Двойной вызов .next () никогда не дает один и тот же элемент (итератор переходит к следующему элементу!), А hasNext () просто проверяет, есть ли другой элемент. Просто назначьте iter1.next () временной переменной / переменной области, если вы планируете использовать ее повторно.

bsaverino 03.12.2018 21:47

Другие вопросы по теме