• 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
Możesz ukryć, zamknąć lub zmodyfikować swoje pytanie, za pomocą przycisków znajdujących się pod nim. Nie krępuj się poprawić pochopnie opublikowanego pytania czy zamknąć go po uzyskaniu satysfakcjonującej odpowiedzi. Umożliwi to zachowanie porządku na forum.Przyciski pytania

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.

...