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

question-closed Java - tablice - wyeliminuj wszystkie powtórzenia elementów tablicy

Object Storage Arubacloud
0 głosów
1,203 wizyt
pytanie zadane 7 listopada 2018 w Java przez Tom_Ja Dyskutant (7,970 p.)
zamknięte 8 listopada 2018 przez Tom_Ja

No właśnie. Jak wyeliminować wszystkie powtórzenia elementów tablicy?

Mój tok myślenia, czy jest poprawny?

Tworzymy zmienną do zliczania powtórzonych wyrazów, lecimy po tablicy po i (lecimy po tablicy po j, bo chcemy każdy wyraz z każdym) i porównujemy czy element tablicy i jest równy elementowi z j, jeśli tak to inkrementujemy zmienną do zliczania (jeśli zmienna wyjdzie zero to zwracamy niezmienioną tablicę)
i tworzymy nową tablicę o rozmiarze starej pomniejszony o ilość zliczonych powtórzeń

No właśnie, i jak teraz przekopiować te stare niepowtórzone wyrazy?

komentarz zamknięcia: Odpowiedź uzyskana
komentarz 7 listopada 2018 przez X3h Dyskutant (9,540 p.)

Czy to ma być taka postać?

int[] withRepeat = {1,1,4,5,6,7,8,8,1,2,3,4,5,6,7,8,9};

 

komentarz 7 listopada 2018 przez Tom_Ja Dyskutant (7,970 p.)
Tak
komentarz 7 listopada 2018 przez X3h Dyskutant (9,540 p.)
Jakiego typu operacje mogę wykonać? Sortowanie, kolekcje?
komentarz 7 listopada 2018 przez Tom_Ja Dyskutant (7,970 p.)
Jak najbardziej podstawowe: najlepiej (jeśli się da) tylko pętle, tablice. Mniej więcej ten poziom ;)

4 odpowiedzi

+1 głos
odpowiedź 7 listopada 2018 przez mbabane Szeryf (79,280 p.)

Jeśli chodzi o Jave to, że tak powiem dziś robi się to tak (streamami):

int[] tab = {1,1,1, 2,2, 3,3, 4,4,4, 5,5,5};

int[] uniques =Stream.of(tab).distinct().toArray();

Jeśli chodzi o opracowanie algorytmu to:

https://stackoverflow.com/questions/20180902/fastest-way-to-find-if-all-the-elements-of-an-array-are-distinct

0 głosów
odpowiedź 7 listopada 2018 przez X3h Dyskutant (9,540 p.)
public int[] removeDuplicates(int[] input) {
	Arrays.sort(input);
	int n = input.length;
	int[] tmp = new int[n];
	int j = 0; 
	for(int i = 0; i < n-1; ++i){
		if(input[i] != input[i+1]){
			tmp[j++] = input[i];
		}
	}
	tmp[j++] = input[n-1];
	int[] result = new int[j];
	for(int i = 0; i < j; ++i) {
		result[i] = tmp[i];
	}
	return result;
}

 

0 głosów
odpowiedź 8 listopada 2018 przez Tom_Ja Dyskutant (7,970 p.)
void zróbRóżnowartościową() {
	        boolean [] unique = new boolean[tablica.length];
	        int counter = 0;

	        for (int i = 0; i < unique.length; i++) {
	            unique[i] = true;
	            // wstępnie oznaczamy elementy na true
	        }

	        for(int i = 0; i < tablica.length; i++) {
	            for(int j = 0; j < i; j++) {
	                if(tablica[j] == tablica[i])
	                    unique[i] = false;
	                // powtarzające się elementy oznaczamy false
	            }
	            if(unique[i])
	                counter ++;
	            //tak długo jak jest tablica unique jest true, zwiększamy licznik - liczymy liczbę dobrych, niepowtórzonych elementów tej tablicy
	        }

	        int [] newtablica = new int[counter];
	        // tworzymy tablicę o rozmiarze licznika - dobrych elementów
	        int j = 0;
	        for (int i = 0; i < tablica.length; i++) {
	            if(unique[i]) { // jeśli unique jest true
	                newtablica[j] = tablica[i]; // zapisz w nowej tablicy
	                j++; // przechodzimy do kolejnego slotu w nowej tablicy
	            }
	        }
	        tablica = newtablica; // nasza tablica staje się nową tablicą
	    }

Zawsze może być takie rozwiązanie.

–1 głos
odpowiedź 7 listopada 2018 przez Tomasz90 Nałogowiec (25,140 p.)
a dlaczego nie zamienisz sobie tej tablicy na Set? wtedy powtorzenia same się wyeliminują
komentarz 7 listopada 2018 przez Tom_Ja Dyskutant (7,970 p.)
takie zadanie :)
komentarz 7 listopada 2018 przez mokrowski Mędrzec (155,460 p.)
No to sprawdzaj czy wartości nie ma w pomocniczym secie i jeśli jest to eliminuj a jak nie ma to dodaj do set'a. BTW. typowe zadanie na rekrutacjach :)
komentarz 7 listopada 2018 przez Tomasz90 Nałogowiec (25,140 p.)
Nie napisałeś czy można sortować taką tablicę czy nie bo wtedy można sobie utworzyć tablicę na początku i wtedy iterując po takiej posortowanej tablicy możesz patrzyć czy obecny element jest taki jak poprzedni, a jeżeli nie to dodajesz go do tej drugiej tablicy która nie ma duplikatów (tworzysz ją przed wejściem do pętli).

Drugi sposób to taki jak napisałeś z tym, że nie potrzebujesz licznika nawet tylko zwykłego booleana. Przed wejściem do wewnętrznej pętli ustawiasz go na true i jeżeli w wewnętrznej pętli przy porównywaniu obu elementów okaże się, że znalazłeś duplikat to ustawiasz go na false. Jeżeli po wyjściu z wewnętrznej pętli ten boolean dalej jest ustawiony na true to dodajesz element do tablicy wynikowej, którą utworzyłeś na samym początku.
komentarz 7 listopada 2018 przez Wiciorny Ekspert (269,710 p.)

@Tomasz90, a co Cię to wtedy nauczy ? Jaki to jest sens, po drugie " wiesz co się dzieje pod spodem" ile operacji jest wykonywanych, jakie to jest marnowanie zasobu pamięci, czasu algorytmicznego etc?... właśnie to jest to - jak ktoś nie myśli :) tylko używa czegoś " bo to coś tak działą, więc użyjmy tego do tego celu " 

1
komentarz 7 listopada 2018 przez Tomasz90 Nałogowiec (25,140 p.)
edycja 7 listopada 2018 przez Tomasz90
Nigdzie nie było napisane czy w tym zadaniu on może używać kolekcji czy nie (w momencie gdy udzielałem odpowiedzi). Nie wiem na jakim poziomie osoba pytająca zna Jave, to udzieliłem takiej odpowiedzi. Jak autor napisał, że nie może to opisałem mu słownie algorytm bez ich użycia. Śmieszy mnie, że mądrzysz się w każdym temacie, masz każdego za głupka tak jakby implementacja zbioru, listy, haszmapy była jakąś wiedzą tajemną, którą jedynie Ty na tym forum posiadasz.
komentarz 7 listopada 2018 przez mokrowski Mędrzec (155,460 p.)

@Wiciorny, hmm.. nie wiem... to co napisałeś o "sensie i dzianiu się pod spodem" to argumentacja czy manifestacja przekonań? :) Bo jeśli to 1 to mam inne zdanie a jeśli to 2 to nie ma sensu ich zmieniać jeśli Ci się sprawdzają.

Podobne pytania

0 głosów
1 odpowiedź 361 wizyt
pytanie zadane 29 listopada 2017 w Java przez Grossman Nowicjusz (170 p.)
0 głosów
3 odpowiedzi 362 wizyt

92,556 zapytań

141,404 odpowiedzi

319,561 komentarzy

61,942 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!

...