Итак, у меня есть этот метод, он не завершен, потому что не могу заставить его работать с тем набором, который у меня есть. Набор, у которого есть {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;
}
Возможный дубликат Как рассчитать пересечение двух множеств?
Я использую специально подготовленный HashSet.java. Я не могу использовать какие-либо доступные java.utils для решения проблемы, кроме использования данной проблемы HashSet. Мне как-то удалось с некоторой помощью на Stack заставить работать метод Union и метод различия, но пересечение так неуловимо. Надеюсь, кому-нибудь я смогу помочь.
Переберите свой хэш-набор, используйте contains, чтобы проверить, содержит ли хэш-набор, переданный в качестве параметра, текущий элемент. Если это так, добавьте этот элемент в возвращаемый хэш-набор пересечения.




Что касается вашей проблемы с 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 ("}");
Это мой метод пересечения, '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 ())); }} возвратите пересечение; }
Извините, но мой первоначальный ответ должен быть достаточно содержательным (другие комментарии также могут помочь). В самом деле, я вижу проблему в вашем втором комментарии, и она все еще связана с тем, как вы используете итераторы. Вы проверяете iter1.next () на s1, а затем добавляете iter1.next () для пересечения! Двойной вызов .next () никогда не дает один и тот же элемент (итератор переходит к следующему элементу!), А hasNext () просто проверяет, есть ли другой элемент. Просто назначьте iter1.next () временной переменной / переменной области, если вы планируете использовать ее повторно.
Возможный дубликат Как рассчитать пересечение двух множеств?