Пресичане на два списъка в Java

1. Общ преглед

В този урок ще научим как да извлечем пресечната точка на два списъка .

Както много други неща, това стана много по-лесно благодарение на въвеждането на потоци в Java 8.

2. Пресичане на два списъка със струни

Нека създадем два списъка на String s с някакво пресичане - и двата имат някои дублирани елементи:

List list = Arrays.asList("red", "blue", "blue", "green", "red"); List otherList = Arrays.asList("red", "green", "green", "yellow");

И сега ще определим пресечната точка на списъците с помощта на поточни методи :

Set result = list.stream() .distinct() .filter(otherList::contains) .collect(Collectors.toSet()); Set commonElements = new HashSet(Arrays.asList("red", "green")); Assert.assertEquals(commonElements, result);

Първо премахваме дублираните елементи с различно . След това използваме филтъра, за да изберем елементите, които също се съдържат в otherList .

Накрая преобразуваме изхода си с Collector . Пресечната точка трябва да съдържа всеки общ елемент само веднъж. Поръчката не трябва да има значение, така че toSet е най-ясният избор, но можем да използваме и toList или друг метод за събиране.

За повече подробности прегледайте нашето ръководство за колекционери на Java 8.

3. Пресичане на списъци с персонализирани класове

Ами ако нашите списъци не съдържат String s, а по-скоро копия на персонализиран клас, който сме създали? Е, стига да следваме конвенциите на Java, решението с поточни методи ще работи добре за нашия потребителски клас.

Как методът contains решава дали конкретен обект се появява в списък? Въз основа на метода на равни . По този начин трябва да заменим метода equals и да се уверим, че той сравнява два обекта въз основа на стойностите на съответните свойства.

Например два правоъгълника са равни, ако техните ширини и височини са равни.

Ако не заменим метода equals , нашият клас използва изпълнението на equals на родителския клас. В края на деня, или по-скоро веригата за наследяване, се изпълнява методът на обектите ' equals ' . Тогава два екземпляра са равни само ако се отнасят до абсолютно един и същ обект в купчината.

За повече информация относно метода equals вижте нашата статия за Java equals () и hashCode () Contracts.

4. Заключение

В тази бърза статия видяхме как да използваме потоци за изчисляване на пресичането на два списъка. Има много други операции, които преди бяха доста досадни, но са доста ясни, ако се ориентираме в Java Stream API. Разгледайте нашите допълнителни уроци с Java потоци тук.

Примери за кодове са достъпни в GitHub.