• 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

+1 głos
29 wizyt
pytanie zadane 22 lipca 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 przez Wiciorny Mędrzec (156,560 p.)
edycja 22 lipca 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 549 wizyt
+1 głos
1 odpowiedź 8,413 wizyt
0 głosów
1 odpowiedź 762 wizyt
Porady nie od parady
Zadając pytanie postaraj się o poprawną pisownię i czytelne formatowanie tekstu.Kompozycja

84,178 zapytań

132,949 odpowiedzi

294,115 komentarzy

55,592 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...