NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Vyhledávání nejčastějšího výskytu v poli

V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Honza B.
Člen
Avatar
Honza B.:7.3.2017 10:53

Ahoj,

mám za úkol:

naplnit pole o n-prvcích náhodnými čísly od 1-10. Poté vyhledejte číslo, které se vyskytlo nejčastěji a kolikrát se vyskytlo..

Počet prvků jsem nastavil tak, že si je zvolí uživatel, poté se pole naplní náhodnými čísly. Při snaze nalézt vhodný způsob, jak zjistit výskyt a počet výskytů onoho nejčastějšího čísla jsem se zasekl. Pole jsem si seřadil s tím, že budu vědět, jak dál, ale bohužel nevím. Můžu poprosit o radu?

import java.util.Arrays;
public class Ukol {
        public static void main (String[] args){
                int m;
                System.out.print("zadej pocet prvků pole: ");
                m = VstupDat.ctiInt();
                System.out.println();
                int[] a = naplnPole(m);
                tiskPole(a);

                System.out.println();

   Arrays.sort(a);
   System.out.println("Seřazené pole:\n");
   for (int cislo : a) {
   System.out.print(" " + cislo + " ");
   }

   System.out.println();

}

        static int[] naplnPole(int m){
                int[] x = new int[m];
                for (int i = 0; i<x.length; i++){
                                x[i] = (int)(Math.random()*10+1);
                }
                return x;
        }

        static void tiskPole(int[] x){
                for (int i = 0; i<x.length; i++){
                                System.out.printf("%3d",x[i]);
                        }
                        System.out.println();
                }
        }

Taskkill odpověděl:

Pokud sis ho seřadil, tak stačí cyklem projít každý prvek.
Před cyklem si vytvořit své proměnné, nejcastejsi_cislo a pocet_vyskytu a favorit a pocet_noveho_fa­vorita.
Inicializovat nejcastejsi_cislo na první hodnotu seřazeného pole a pocet_vyskytu na 1.
Pak v každém průchodu cyklu zkontroluj jestli současná hodnota pole je stejná jako tvoje nejčastější číslo, pokud ano zvětši počet výskytu. Pokud ne, umísti tohle číslo do favorita a zvětši mu výskyt. Pokud při dalším průchodu zjistíš že se favorit změnil, změn favorita a vynuluj, respektive vyjedničkuj mu počet. Pokud nějaký favorit překoná nejčastější číslo, změn nejčastější číslo a změn jeho počet.

Zkoušel jsem to podle rady Taskkilla, ale zamotal jsem se v tom. Pokud mi to můžete někdo ukázat ve zdrojáku, budu vám vděčný.

Předem moc děkuju. :-)

 
Odpovědět
7.3.2017 10:53
Avatar
Petr
Člen
Avatar
Petr:7.3.2017 12:57

Radit to nemusis, je to zbytecna rezie navic, mnozina moznych cisel je konecna a relativne mala (cisla od 1 do 10).
Staci si nadefinovat pomocne pole treba integeru o 10 prvcich, pak projdi to pole cisel a u kazdeho cisla vem jeho hodnotu a inkrementuj hodnotu v pomocnem poli na indexu ktery odpovida hodnote cisla. A pak uz jen projdi pomocne pole a zjisti ktery z tech deseti prvku ma nejvetsi hodnotu (cislo se vyskytlo v nejvetsim mnozstvi).

 
Nahoru Odpovědět
7.3.2017 12:57
Avatar
Honza B.
Člen
Avatar
Honza B.:9.3.2017 12:02

Tak jsem to zkoušel podle Taskkilla. Návod od Petra jsem si musel přečíst 5x :-D
Napsal jsem tohle:

import java.util.Arrays;
public class KU1LS {
        public static void main (String[] args){
                int m;
                char odpoved;
do{
                System.out.print("zadej pocet prvků pole: ");
                m = VstupDat.ctiInt();
                System.out.println();
                int[] a = naplnPole(m);
                tiskPole(a);

                System.out.println();
 Arrays.sort(a);
 System.out.println("Seřazené pole:\n");
 for (int cislo : a) {
 System.out.print(" " + cislo + " ");
 }



   int nejcas_cislo=a[0];
   int pocet_vyskyt=1;
   int pocet_pomoc=0;
   int pomoc=0;
   for (int i=1; i<a.length; i++){
        if (a[i]==nejcas_cislo){
                pocet_vyskyt++;
        if (a[i]>nejcas_cislo)
                pomoc=a[i];
                pocet_pomoc++;
                }
        if (a[i]>pomoc)
                pocet_pomoc=0;
                pomoc=0;
                pomoc=a[i];
                pocet_pomoc++;


        if (pocet_pomoc>pocet_vyskyt){
                pocet_vyskyt=0;
                nejcas_cislo=0;
                nejcas_cislo=pomoc;
                pocet_vyskyt=pocet_pomoc;
        }
        }

   System.out.println();
        System.out.println("\ncislo:  -------- " +nejcas_cislo);
        System.out.println("vyskytlo se: " +pocet_vyskyt);

   System.out.println();

                System.out.print("\nChcete začít znovu? A,a = Ano; N,n = Ne: ");
                        odpoved=VstupDat.ctiChar();
                        while((odpoved=='N')||(odpoved=='n')){
                        break;
                        }
                }while((odpoved=='A')||(odpoved=='a'));

                }

        static int[] naplnPole(int m){
                int[] x = new int[m];
                for (int i = 0; i<x.length; i++){
                                x[i] = (int)(Math.random()*10+1);
                }
                return x;
        }

        static void tiskPole(int[] x){
                for (int i = 0; i<x.length; i++){
                                System.out.printf("%3d",x[i]);
                        }
                        System.out.println();
                }
        }

Ale jednou mi to napíše správný výsledek, ale při dalším výpočtu to připíše k počtu výskytu +1 (např. 2 je tam 4x a napíše "Počet výskytu: 5", apod.). Ještě bych chtěl ošetřit to, když se tam některá čísla objeví ve stejném počtu, např. 3x6 a 3x8, aby to vypsalo obojí, ale není to nutné :-)
Kde v tom kódu mám chybu? Jen předem poprosím, neptejte se, proč to píšu tak složitě nebo hloupě, jsem začátečník, u programování sedím, když můžu, ale musím chodit do práce, která se bohužel počítačů moc netýká, někdy se k programování nedostanu třeba 2 dny a k tomu ve škole nemám jen javu, ale i jiné předměty.
Moc děkuji za případnou pomoc :-)

 
Nahoru Odpovědět
9.3.2017 12:02
Avatar
lucas.marvan
Člen
Avatar
Odpovídá na Honza B.
lucas.marvan:13.3.2017 23:06

Udělej to tak jak říká Petr. Tohle je nečitelný mišmaš. Buď trochu elegantnější.
Kouskuj si všechno do metod, které názvem popisují chování = necpi to všechno do metody main, tam ať jsou pouze volání jedné či více metod.
Pro názvy v javě npoužívej podtržítka ale camelCase.
A hlavně: nepoužívej češtinu. Zvykni si psát kód anglicky :)

Takže smaž to a napiš znovu dle rady Petra a nepoužívej v kódu toto:

System.out.println("\ncislo:  -------- " +nejcas_cislo);
System.out.println("vyskytlo se: " +pocet_vyskyt);

ale napiš si na to metodu

static void println(String text, int number) {
        System.out.println(text + number);
        }

a podobne i na ostatni veci. Rozporcuj úlohu na trivialni nedelitelne casti, napis si metody a pak teprve pis vnitrek tech metod.

Držím palce

 
Nahoru Odpovědět
13.3.2017 23:06
Avatar
lucas.marvan
Člen
Avatar
Odpovídá na Petr
lucas.marvan:13.3.2017 23:07

Petře omlouvám se ti. Z únavy jsem ti dal omylem dislike :( Zareaguj a já ti dám like. Sorry

 
Nahoru Odpovědět
13.3.2017 23:07
Avatar
Petr
Člen
Avatar
Odpovídá na lucas.marvan
Petr:14.3.2017 12:47

Nevadi, ja to stejne neresim, like/dislike ma nulovou informacni hodnotu oproti prispevku. Pro zajimavost jeste prikladam reseni v java 8 stream api:

List<Integer> list = new Random().ints(100, 1, 10).boxed().collect(Collectors.toList());
System.out.println("Pole: " + list);
Map<Integer, Long> counted = list.stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
counted.entrySet().stream().sorted((e1, e2) -> Long.compare(e2.getValue(), e1.getValue())).forEach(entry -> System.out.println("Cislo: " + entry.getKey() + ", pocet vyskytu: " + entry.getValue()));
 
Nahoru Odpovědět
14.3.2017 12:47
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.