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

najczęściej występujące elementy w tablicy

Object Storage Arubacloud
+1 głos
409 wizyt
pytanie zadane 22 lipca 2021 w Java przez blabsi Nowicjusz (130 p.)

Witam, mam do napisania program wyświetlający wszystkie elementy, które pojawiają się najczęściej w tablicy.

W pierwszej pętli for zliczam ile najczęściej występuje jakiś element (max - maksymalna liczba wyświetleń). W drugiej pętli for sprawdzam, które elementy tablicy pojawiły się max razy. Te elementy chcę zapisać w tablicy 'tab'. Jednak tutaj popełniam błąd, ponieważ chcę uzyskać [5, 7] a wyświetla się [5, 7, 5, 7, 7, 5, 7, 5]. Błąd zaczyna się gdzieś w pętlach od linijki "int k=0" jednak nie umiem tego naprawić, proszę o pomoc. 

int[] tablica = {4,5,7,6,3,5,7,8,7,5,7,5,8,4,3};		
		
		int max = 0;			
		int element = tablica[0];		
		int[] tab = {};
		
		for (int i = 0; i < tablica.length; i++) {
			int licznik = 0;
			for (int j = 0; j < tablica.length; j++) {
				if (tablica[i] == tablica[j]) {
					licznik++;
				}
			}						
			if (licznik > max) {
				max = licznik;				
			}					
		}	
		
		for (int i = 0; i < tablica.length; i++) {
			int licznik = 0;
			for (int j = 0; j < tablica.length; j++) {
				if (tablica[i] == tablica[j]) {
					licznik++;
				}
			}
			
			if (licznik == max) {
				element = tablica[i];			
				
                int[] tab1 = new int[tab.length+1];
				int k=0;			
				for (; k < tab.length; k++) {		 					
					tab1[k] = tab[k];
				}
				
				for (int e : tab1) {
					if (element != e) {
						tab1[k] = element;
					}				
				}
				tab = tab1;
			}		
		}	
		System.out.println(Arrays.toString(tab));

 

1 odpowiedź

0 głosów
odpowiedź 22 lipca 2021 przez Wiciorny Ekspert (270,190 p.)
edycja 22 lipca 2021 przez Wiciorny

Tak przy okazji tu masz przykład jak można to zrobić na strumieniu 

int data[] = { 1, 5, 7, 4, 6, 2, 0, 1, 3, 2, 2 };
Map<Integer, Long> count = Arrays.stream(data)
    .boxed()
    .collect(Collectors.groupingBy(Function.identity(), counting()));

int max = count.entrySet().stream()
    .max((first, second) -> {
        return (int) (first.getValue() - second.getValue());
    })
    .get().getKey();

System.out.println(max);

Analizując twój przykład strasznie przekombinowałeś generalnie nie wiem po co niektóre operacje jak licznik, skoro zliczasz elementy po sobie iterując a nie te co się powtarzając 
Zmienna element nie ma sensu, ustawiania jej na tab[0]...

dalej idąc rezultat i tak bedzie tablica bo przepinasz referencje. 
Generalnie jeśli jednak chcesz zachować swoje rozwiązanie, jednak na końcu to twoja praca jesteś autorem to  wypisując możesz zastosować distinct na tablicy wynikowej i otrzymać to co chcesz 

System.out.println(Arrays.toString(Arrays.stream(tab).distinct().toArray()));

tworzysz w strumieniu, wybierasz tylko pojedyncze elementy i rezultat jest [5,7]  bez powtórzeń 

Generalnie rozumiem twoje założenie, ale to jest troszeczke za duzo operacji najpierw zliczasz maksymalne wystapienia a potem powtarzasz te operacje dla tej wartosci i dodajesz ja do tablicy... bez sensu, pomysl o SORTOWANIU :) i potem myknij to porównaniem po kolei zliczając

Podobne pytania

0 głosów
2 odpowiedzi 1,115 wizyt
+1 głos
1 odpowiedź 11,324 wizyt
0 głosów
1 odpowiedź 1,039 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

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

...