Počet nejmenších opakujících se prvků v poli a jejich hodnota – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Počet nejmenších opakujících se prvků v poli a jejich hodnota – Java – Fórum – Programujte.comPočet nejmenších opakujících se prvků v poli a jejich hodnota – Java – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
K4BlOs
~ Anonymní uživatel
56 příspěvků
13. 11. 2012   #1
-
0
-

Ahoj potřeboval bych zjistit kolikrát se mi v poli opakuje nejmenší číslo a jeho hodnotu. Napsal jsem tohle

import java.util.*;

public class XXX {
	public static Scanner sc = new Scanner(System.in);
	
	static void bublinkoveRazeni(int[] pole) {
		for (int i = pole.length-1; i > 0; i--) {
			for (int j = 1; j <= i; j++) {
				if (pole[j-1] > pole[j]) {
					int tmp = pole[j-1];
					pole[j-1] = pole[j];
					pole[j] = tmp;
				}
			}
		}
	}
	
	public static void main(String[] args) {
		System.out.println("Zadej jednotlive prvky pole: ");
		int[] pole = new int[10];
		for (int i = 0; i < pole.length; i++) {
			System.out.print("p[" + i + "]: ");
			pole[i] = sc.nextInt();
		}
		System.out.println("---Vysledky---");
		System.out.println(Arrays.toString(pole));
		bublinkoveRazeni(pole);
		System.out.println(Arrays.toString(pole));
		int h = 0;
		int v = 0;
		int max = Integer.MIN_VALUE;
		//postupně projde pole čísel a vždy vybere jedno z nich.
		for (int i = 0; i < pole.length; i++) {
			//projde všechna čísla která v poli leží napravo od čísla vybraného.
				for (int j = i + 1; j < pole.length; j++) {
					// Pokud se čísla rovnají zvýší proměnnou v o 1
					if (pole[i] == pole[j])
						v++;
				}
				if (v > max) {
					max = v;
					h = i;
				}
		}
		System.out.print("Max. pocet je "+ v + " x " + h);
	}
}

myslím že mám někde chybu f těch for cyklech, ale nemůžu na to přijít :)

Nahlásit jako SPAM
IP: 176.12.115.–
Reklama
Reklama
reciproke0
Návštěvník
13. 11. 2012   #2
-
0
-

Jedna chyba je ve výpisu, uvědom si co je v čem uloženo.

Druhá je že "v" musíš před každým potencionálním opakujícím se bloku nastavit na 1. Jinak se ti sčítají všechny duplicity v poli.

Nahlásit jako SPAM
IP: 82.208.4.–
sleepy0
Stálý člen
13. 11. 2012   #3
-
0
-

#1 K4BlOs
Ak chces zistit len najmensi prvok, pola a jeho pocet v poli, tak nemusis sortovat:

public void najmensiPrvok(int[] a){
	int min = Integer.MAX_VALUE;
	int pocet = 1;
	for(int i=0; i<a.length; i++){
		// ak je najmensi a ak nan narazi zvacsi pocet o 1
		// ak najdem mensi priradim do min a nastavim pocet na 1
		if(min == a[i]){
			pocet++;
		}
		else if(min > a[i]){
			pocet = 1;
			min = a[i];
		}
	}
	System.out.println("Najmensi prvok je "+min+" a jeho pocet je"+pocet);
}
Nahlásit jako SPAM
IP: 158.195.195.–
K4BlOs
~ Anonymní uživatel
56 příspěvků
13. 11. 2012   #4
-
0
-

ten bubleSort tam musi byt :)

Nahlásit jako SPAM
IP: 176.12.115.–
reciproke0
Návštěvník
13. 11. 2012   #5
-
0
-

#3 sleepy

Na to nejmenší jsem také koukal, jak je to myšleno. Třeba když bude 2, 2, 2, 3, 4, 5, 5, 5 => 3x2 a 3x5, teď se uplatní požadavek na nejmenší => 3x2. Což je v pořádku zajištěno podmínkou ... if (v > max) ...

#4 K4BlOs

Máš to už opravené?

Nahlásit jako SPAM
IP: 82.208.4.–
sleepy0
Stálý člen
13. 11. 2012   #6
-
0
-

#4 K4BlOs
Ok, tak ho tam dopis a nemusis ho pre tento algoritmus pouzivat, alebo ked uz teda mas to pole zoradene. Tak preskumaj len prvych par prvkov, ktore su rovnake. To ti da pocet a sortovanim mas zarucene, ze prvy bude najmensi. Asi takto:
 

public void pocetNajmensiehoPrvku(int[] a){ 
// a musi byt sortovane zoradene od najmensieho po najvacsie
	int tmp = a[0];
	int i=1
	while(tmp==a[i]){
		i++;
	}
	System.out.println("Najmensi prvok je: "+a[0]+" a jeho pocet je "+i);
}
Nahlásit jako SPAM
IP: 158.195.195.–
sleepy0
Stálý člen
13. 11. 2012   #7
-
0
-

#5 reciproke
Aha potom sa ospravedlnujem, ja som myslel ze vyhladam najmensi prvok a jeho pocet. A ono je to tak, ze mam hladat pocty jednotlivych prvkou, ziskat prvky s max poctami a potom ak maju dva rovnake pocty tak vyhladat minimalny. No tak na to sa da pouzit nedavno zmieneny algoritmus tu na fore pre modus a rozsirit ho o to, ze ak najdes rovnako pocetny prvok v sortovanom poli, neber ho v uvahu, iba ak najdes vacsi pocet.

Nahlásit jako SPAM
IP: 158.195.195.–
Dano
~ Anonymní uživatel
100 příspěvků
13. 11. 2012   #8
-
0
-

K4BlOs

mam otazku, preco pracujes s polom? Mas to dane, alebo je na to iny dovod?

a mam aj navrh ;)

/**
 * Najdenie najmensieho zadaneho cisla a poctu jeho vyskytov
 * 
 * @author dano
 */
public class Main {
    
    private static final int MAX_POCET_PRVKOV = 10;
    
    public static void main(String[] args) {
        System.out.println("Zadaj " + MAX_POCET_PRVKOV + " cisiel");
        
        Map<Integer, Integer> mapa = nacitajVstup(new Scanner(System.in));
        getMinimum(mapa);
    }
    
    /**
     * Nacitanie vstupu 
     * 
     * @param scanner   
     * @return          Map<Integer, Integer> kde klucik je jedinecne
     *                  zadane cislo a hodnota je pocet jeho vyskytu
     */
    private static Map<Integer, Integer> nacitajVstup(Scanner scanner) {
        Map<Integer, Integer> mapa = new HashMap<Integer, Integer>();
        int pocet = 0;
        while(pocet < MAX_POCET_PRVKOV) {
            String vstup = scanner.next();
            try {
                int cislo = Integer.parseInt(vstup);
                if (mapa.get(cislo) == null) {
                    mapa.put(cislo, 0);
                }
                mapa.put(cislo, (mapa.get(cislo) + 1));
                pocet++;
            } catch(Exception e) {
                System.err.println("nespravne zadane cislo[" + vstup + "]");
            }
        } 
        
        return mapa;
    }
    
    /**
     * Vypise minimum a pocet jeho vyskutu
     * 
     * @param mapa 
     */
    private static void getMinimum(Map<Integer, Integer> mapa) {
        Set<Integer> prvky = mapa.keySet();
        int min = Collections.min(prvky);
        System.out.println("minimum je " + min + " pocet vyskytov je " + mapa.get(min));
    }
}
Nahlásit jako SPAM
IP: 78.98.66.–
K4BlOs
~ Anonymní uživatel
56 příspěvků
14. 11. 2012   #9
-
0
-

aha omlouvam se vsem-po znovu precteni zadani jsem si uvedomil ze jsem to asi spatne pochopil. ma to byt takto

Mam vypsat velikost nejdelšího úseku (v) opakujících se stejných čísel a hodnotu (h) tohoto čísla ve tvaru: Max. pocet je v x h. Při stejném počtu opakujících se prvků se vypíše prvek s nejmenší hodnotou.

az prijdu z prace domu, pokusim se to napravit :9

Nahlásit jako SPAM
IP: 176.12.115.–
reciproke0
Návštěvník
14. 11. 2012   #10
-
0
-

#9 K4BlOs
Já díky ignoraci zadání, pochopení z názvu vlákna a existujícího návrhu jsem to tak pochopil. Takže opravit ty 2 "detaily" co jsem ti psal a je to ok

Nahlásit jako SPAM
IP: 147.32.184.–
K4BlOs
~ Anonymní uživatel
56 příspěvků
14. 11. 2012   #11
-
0
-

#10 reciproke
tak jsem k tomu zase sedl.Mohl bys mě ještě trochu víc nakopnout? Jestli jsem to napsal dobře tak začnu projíždět pole s "i" a druhý for cyklus začnu projíždět o 1 dál tedy "i+1" a když se tato sousední prvky rovnají tak mi to "v" zvýší o "1" ne? Ale nevim jestli na to nemá náhodou vliv i to původní pole neseřazené a taky to řazení?

Nahlásit jako SPAM
IP: 176.12.115.–
reciproke0
Návštěvník
14. 11. 2012   #12
-
0
-

#11 K4BlOs
Zda je seřazené pole nebo ne v použitém algoritmu nemá žádný vliv.

Jak říkáš první for vezme číslo na pozici "i" a druhý do porovná se všemi násludujícími. Když při dalším opakování bude porovnávat číslo na "i+i" tak potřebuješ "v" nastavit na 1 a ne přičítat k tomu co ti tam zůstalo z předcházejícího.

Jinak výsledek tak jak to máš... počet je uložený v "max" a index prvku v poli odpovídající výskytu max je v "v"

oprava: index čísla s maximálním výskytem máš v "h"

Nahlásit jako SPAM
IP: 82.208.4.–
K4BlOs
~ Anonymní uživatel
56 příspěvků
14. 11. 2012   #13
-
0
-

já to asi prostě nerozchodim :(

Nahlásit jako SPAM
IP: 176.12.115.–
reciproke0
Návštěvník
14. 11. 2012   #14
-
0
-

#13 K4BlOs
Myslím že na správné místo doplnit jeden řádek a v druhém zaměnit proměnné by neměl být problém. Takže ani nechápeš co máš špatně, nebo jak to je?

Nahlásit jako SPAM
IP: 82.208.4.–
K4BlOs
~ Anonymní uživatel
56 příspěvků
14. 11. 2012   #15
-
0
-

no já jsem zkoušel různý možnosti co mě napadaly, ale když jsem zadal, že v = 1 tak mi to pak zase už nezvyšovalo o "1" atd až sem se do toho zamotal, že už nevim co jsem zkoušel a co ne a co vlastně bych měl ještě zkusit :(

Nahlásit jako SPAM
IP: 176.12.115.–
reciproke0
Návštěvník
14. 11. 2012   #16
-
0
-

#15 K4BlOs
No co na to říct, trošku zapojit hlavu... co takhle to dát před ten for co počítá ty výskyty?

Nahlásit jako SPAM
IP: 82.208.4.–
K4BlOs
~ Anonymní uživatel
56 příspěvků
14. 11. 2012   #17
-
0
-

asi takto?

int h = 0;
		int v = 0;
		int max = Integer.MIN_VALUE;
		//postupně projde pole čísel a vždy vybere jedno z nich.
		for (int i = 0; i < pole.length; i++) {
			v = 1;
			//projde všechna čísla která v poli leží napravo od čísla vybraného.
				for (int j = i + 1; j < pole.length; j++) {
					// Pokud se čísla rovnají zvýší proměnnou v o 1
					if (pole[i] == pole[j]) {
						v++;
					}
				}
				if (v > max) {
					max = v;
					h = pole[i];
				}
		}
		System.out.print("Max. pocet je " + max + " x " + h);
Nahlásit jako SPAM
IP: 176.12.115.–
K4BlOs
~ Anonymní uživatel
56 příspěvků
14. 11. 2012   #18
-
0
-

#16 reciproke
Díky za tvůj čas a strpení se mnou :) vypadá to že mi to funguje tak jak má

Nahlásit jako SPAM
IP: 176.12.115.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 37 hostů

Podobná vlákna

Počet prvků poli — založil suchla12

Počet prvků v poli — založil Hmm

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý