• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Java 8 Stream - sprawdzenie czy jedna tablica zawiera się w drugiej.

Object Storage Arubacloud
0 głosów
1,086 wizyt
pytanie zadane 5 lutego 2017 w Java przez Swierzak Użytkownik (690 p.)
zmienione kategorie 5 lutego 2017 przez Swierzak
Mam takie zadanie, gdzie muszę sprawdzi czy podane w ramach parametrów metody tablice zawierają się w sobie.

Problem polega na tym, ze obie są typu prymitywnego - int.

Czy za pomocą strumienia mogę sprawdzić czy druga tablica zawiera się w pierwszej ?

Nie oczekuje gotowej odpowiedzi, zaczynam poznawanie strumienie i zastanawiam się czy to w ogóle możliwe.

Za wszelki odp i wskazówki dziekuje :)

1 odpowiedź

+1 głos
odpowiedź 5 lutego 2017 przez Adrian Spora Mądrala (5,100 p.)
wybrane 5 lutego 2017 przez Swierzak
 
Najlepsza

Tak, możesz. Do używania Stream'ów z prymitywnymi typami służą specjalne implementacje interfejsów - IntStream, LongStream i DoubleStream. Tutaj akurat przydadzą się, żeby zamienić int[] na List<Integer>

Używa się ich w taki sposób:

int[] tab1 = {1, 3, 5, 8};
int[] tab2 = {8, 5, 3, 1};

List<Integer> list1 = IntStream.of(tab1).boxed().collect(Collectors.toList());
List<Integer> list2 = IntStream.of(tab2).boxed().collect(Collectors.toList());

boolean sameSize = list1.size() == list2.size();
boolean sameElements = list1.containsAll(list2);

boolean same = sameSize && sameElements;

 

komentarz 5 lutego 2017 przez Swierzak Użytkownik (690 p.)
Dobra, ale tutaj robimy przekształcenie z typu int na Integer, wtedy o ile się nie mylę mogę już użyć metody containsAll.

Ogólnie chodzi o to żeby sprawdzić czy drugi parametr - tablica zawiera się w pierwszej tablicy. Jeśli tak to należy podać indeks wystąpienia pierwszego elementu drugiej tablicy, pamiętając, że wystąpień może być więcej niż jedno.

np. [4,5,2,1,8] i [2,1] powinno zwrócić 2.

ale może być też sytuacja

np [4,5,2,1,8,4,5,2,1,8] i [2,1] powinno zwrócić 7.

Zwykłymi if'ami dałoby rade to zrobić, ale chciałbym w końcu skorzystać z udogodnień Stream API :)

 

Tylko BŁAGAM nie podawajcie mi gotowych rozwiązań bo nie sposób się pózniej nimi nie kierować :D
komentarz 5 lutego 2017 przez Adrian Spora Mądrala (5,100 p.)
Tak, nawet użyłem metody containsAll.

Indeks wystąpienia pierwszego elementu drugiej tablicy? To ma być ostatni indeks, a nie pierwszy, wnioskując po drugim przykładzie?

Jeśli takie jest zadanie to można wykorzystać tą metodę containsAll i jeśli zwróci wartość true to zwrócić pierwsze lub ostatnie wystąpienie pierwszego elementu drugiej listy w pierwszej. Poczytaj o metodzie indexOf i lastIndexOf

Nie ma sensu używać Stream API tam, gdzie to jest trudniejsze i mniej czytelne od konwencjonalnych rozwiązań. Stream API zostało wymyśloone po to, żeby uprościć programowanie, a nie je utrudnić.
komentarz 5 lutego 2017 przez Swierzak Użytkownik (690 p.)
Tak, masz racje. Zgodnie z tym co jest w drugim przykładzie. Ostatnie wystąpienie pierwszego elementu drugiej tablicy.

ale tu pojawia się problem bo containsAll uwzględnia każdy element z osobna, a nie wiem czy tu nie chodzi o wystąpienie drugiej tablicy zgodnie z kolejnością jej elementów.
komentarz 5 lutego 2017 przez Adrian Spora Mądrala (5,100 p.)
Jeśli chodzi o zachowanie kolejności to proszę. Znalazłem genialną metodę w dokumentacji. mając już te listy z obu tabel możesz użyć metody lastIndexOfSubList z klasy Collections. Nie wiedziałem wcześniej o niej :) Tutaj link do dokumentacji do tej metody:

https://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#lastIndexOfSubList(java.util.List,%20java.util.List)
komentarz 5 lutego 2017 przez Swierzak Użytkownik (690 p.)
edycja 5 lutego 2017 przez Swierzak
Dziekuje bardzo.

Zaraz powalczę, jeśli uda mi się to ogarnąć to wstawię tutaj kod, na wypadek gdybyś był ciekawy :)

PS działa zgodnie z poleceniem ! :D dzięki wielkie, tylko teraz mi głupio, że to Ty znalazłeś tą metodę w dokumentacji, a nie ja ! :D muszę tam najpierw zaglądać mając problem, to też cenna lekcja :D

Podobne pytania

0 głosów
1 odpowiedź 444 wizyt
pytanie zadane 3 września 2017 w Java przez plkpiotr Stary wyjadacz (12,420 p.)
+2 głosów
3 odpowiedzi 463 wizyt
pytanie zadane 7 lipca 2015 w C i C++ przez niezalogowany
0 głosów
1 odpowiedź 450 wizyt
pytanie zadane 29 listopada 2017 w Java przez newUser Użytkownik (520 p.)

92,550 zapytań

141,392 odpowiedzi

319,519 komentarzy

61,935 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...