• 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.

Cloud VPS
0 głosów
1,748 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ź 512 wizyt
pytanie zadane 3 września 2017 w Java przez plkpiotr Stary wyjadacz (12,420 p.)
+2 głosów
3 odpowiedzi 908 wizyt
pytanie zadane 7 lipca 2015 w C i C++ przez niezalogowany
0 głosów
1 odpowiedź 509 wizyt
pytanie zadane 29 listopada 2017 w Java przez newUser Użytkownik (520 p.)

93,488 zapytań

142,422 odpowiedzi

322,773 komentarzy

62,908 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

Kursy INF.02 i INF.03
...