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.
Zobrazeno 6 zpráv z 6.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
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).
Tak jsem to zkoušel podle Taskkilla. Návod od Petra jsem si musel
přečíst 5x
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
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
Petře omlouvám se ti. Z únavy jsem ti dal omylem dislike Zareaguj a já ti dám like. Sorry
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()));
Zobrazeno 6 zpráv z 6.