Wyszukiwanie różnych elemntów w dwóch tablicach.

0

Mam pytanie jak najlepiej rozwiązać wyszukiwanie różnych elementów w tablicy.
Mam np tab z elementami tab1 = {2, 3, 5, 8, 9} i tab2 = { 3, 5} wynik w tym przypadku to 2 , 8, 9.

0

Co to znaczy najlepiej? Najmniej kodu? Najbardziej optymalnie pod względem pamięci? Czasu?
Jeśli nie interesuje Cię wydajność to po prostu jedną pętlą leć po elementach pierwszej tablicy i porównuj każdy z elementów z elementami z drugiej tablicy (druga pętla). Jeśli znajdzie duplikat w drugiej tablicy to pomiń tę liczbę, jeśli jest unikatowa to dodaj do nowej listy. Na końcu zwróć listę unikatów.

0

No dobrze ale to bym musiał lecieć w dwie strony tym forem najpierw dla pierwszej tab sprawdzić wszystkie z drugą potem dla drugiej sprawdzić wszystkie z pierwszą. Wtedy znajdzie ale nie będą po kolei.
np. to poniżej znajdzie liczby rożne ale tylko z tablicy pierwszej. Musiałby zrobić drugą pętle for(int j=0 ; j<3; j++ ) i w niej for (int i = 0; i< 4; i++) . I to taki dziwny twór powstaje i do tego nie wypisze po kolei. Chodzi o to jak to rozwiązać najlepiej na forach.

 for(int i=0 ; i<4; i++ ) {
         for (int j = 0; j< 3; j++) {
                 if((tab1[i] != tab2[j]) && tab2.length = j {
                    System.out.println("Różne " + tab1[i] );
               }
               else {
                  if (tab1[i] == tab2[j]) {
                      break;
                  }

Napisane z pamięci nie sprawdzałem czy to się uruchamia ale chodzi o ideę. Mam tab z elementami {2,5,7,8,9} i tab2 z elementami { 1, 4, 7, 9} wynik powinien być {1, 2, 4, 5, 8}
7 i 9 są w obydwu więc wylatują.

0
maf2 napisał(a):

Musiałby zrobić drugą pętle for(int j=0 ; j<3; j++ ) i w niej for (int i = 0; i< 4; i++)

Zmień te stałe wartości na wielkości tablic bo jak Ci się zmieni liczba elementów to będziesz musiał też tutaj poprawiać albo będziesz dostawał exception.

maf2 napisał(a):

Chodzi o to jak to rozwiązać najlepiej na forach.

Jeśli na forach to i tak musisz obie kolekcje przelecieć więc nic na to nie poradzisz. Co do kolejności to wcześniej o tym nie pisałeś. Jeśli mamy takie Zbiory A = { 3,5,7,8}, B = { 3, 6, 8 } to co ma być efektem? {5,6,7} ? Czy { 5,7,6 } też jest okej?

A najszybciej to byś to zrobił wrzucając na stream i użył distinct ale to pewnie jakieś zadanie do szkoły i tak zrobić nie możesz...

List<Integer> listWithoutDuplicates = listWithDuplicates.stream()
     .distinct()
     .collect(Collectors.toList());
0

Jeśli mamy takie Zbiory A = { 3,5,7,8}, B = { 3, 6, 8 } to co ma być efektem? {5,6,7} ? Czy { 5,7,6 } też jest okej? >

No właśnie rozwiązaniem ma być {5,6,7} czyli od najmniejszej do największej. I w tym jest problem.

0

Ehm, nie rozumiemy się. Wynik {5,6,7} jest poprawny bo:
a) Zbiór jest posortowany od najmniejszej do największej
b) W takiej kolejności te elementy występowały w kolekcjach

Jeśli dobrze rozumiem:

No właśnie rozwiązaniem ma być {5,6,7} czyli od najmniejszej do największej.

to odpowiedzią jest A czyli po prostu zbierz unikaty a na końcu posortuj kolekcje.
Nie wyświetlaj od razu wyników jak to robisz teraz tylko dodawaj je do listy. Na końcu listę posortuj i wtedy wyświetl.

Ps. Najlepiej to sobie przerzuć te tablice to listy i masz tam wtedy metodę contains dzięki czemu nie będziesz musiał sam żadnych porównań robić.

0

Jeśli założenie jest takie, że w obu tablicach nie powtarzają się elementy to połącz obie tablice w jedną, posortuj i w jednej pętli przeglądaj, jeśli bieżąca liczba jest różna od następnej i poprzedniej to wyświetl jako unikat. Jeśli występują powtórzenia to posortuj każdą z osobna, a potem scal do jednej tablicy, ale bez powtórzeń (tzn. powtarzające się liczby z danej tablicy dodaj tylko raz do scalonej), i dalej to samo co w poprzednim przypadku.

1 użytkowników online, w tym zalogowanych: 0, gości: 1