Diskuze: Najviac opakovaná položka v Liste
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 31 zpráv z 31.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Na všechno není příkaz, někdy se musí zapojit mozek Musíš si někam ukládat počet
položek.
Ale došli mi nápady, lebo potrebujem, aby mi ukázalo najviac nájdený pixel v bitmape...
To ukládáš každý pixel do listu? To snad ne. Lepší by bylo kdybys napsal co chceš vůbec udělat.
To sis ještě nezvykl, že se místo pole často chybně používá seznam a naopak?
Tohle je spíš na slovník, kde jsou klíčem barvy a hodnotou počet pixelů.
To je fakt, barev je v TrueColor víc než pixelů na obrazovce.
Ukladám každý pixel do listu, pretože potrebujem, aby pixel, ktorý sa
najviac vyskytuje v Bitmap-e bol priehľadný
Aha, takže ke zprůhlednění jedné barvy uložíš milion položek do listu. Zajímavé. Jak jsem psal výše, použiješ Dictionary, ne list.
Kdybys nevěděl jak se s ním zachází, je to popsané detailně tady: http://www.itnetwork.cz/…ziny-hashset
Aha, ale pokiaľ som tomu správne pochopil, keď vložím do množiny nejaký prvok aj viackrát, uloží ho len raz. Ale potom ako zistím, ktorý prvok sa vyskytuje najviac?
Čítal, ale (keďže nemám toľko vedomostí ako ostatný na tejto
stránke) neviem si predstaviť, ako by to fungovalo.
Uděláš si dictionary. S každým pixelem obrázku vezmeš jeho barvu a podíváš se, jestli je ten klíč ve slovníku. Pokud tam není, vložíš pod tuto barvu hodnotu 1. Pokud tam je, přičteš jedna k té hodnotě. Po projetí obrázku budeš mít ve slovníku barvy obrázku a pod každou počet pixelů. Stačí pak vybrat ten nejvyšší.
Aha vďaka, ale ešte jeden dotaz. Vytvorím si
Dictionary<Color, int> farba = new Dictionary<Color, int>(); //
Color bude kľúč ak správne chápem a int bude udávať, koľko pixelov je
tej určitej farby. Potom teda kód bude vyzerať takto:
for (int y = 1; y < bitmap.Height; y++)
for (int x = 0; x < bitmap.Width; x++)
{
Color clr = bitmap.GetPixel(x, y);
if (farba.ContainsKey(clr))
{
???
}
else
{
farba.Add(clr, 1);
}
}
Ale neviem ako budem upravovať int na vyšší
Ano, pochopil jsi to dobře. Mělo by to jít jen takhle:
farba[clr]++;
Kolekce bys měl pojmenovávat vždy množným čísle, ne tedy farba, ale farby. Barva v té proměnné přeci není. Mohlo by se to jmenovat třeba pocetPixelu.
Zrovna nato čumím no, odesílalo se to tak 5 sekund, jinak bych byl
rychlejší já
Ano. Však si to zkus, nemusíš se ptát na všechno
Pozn. Proč ignoruješ levý sloupec pixelů ? (začínáš s y = 1)
Lebo keď dám y = 0, tak pixel 0, 0 mi hneď vyhodí chybu
Protože klíče jsou barvy. Ty hledáš hodnotu. Snažíš se tedy najít maximální barvu, což jaksi nejde. Můžeš použít mocné metody LINQu:
Color priehladnaFarba = farby.MaxBy(kvp => kvp.Value).Key;
Nebo si to prostě projet cyklem. Dalo by se i najít maximální hodnotu a potom klíč té hodnoty, ale to zbytečně projíždí kolekci 2x.
Jo, potřebuješ vlastně maximum Value, tak buď si seřadíš ten slovník pomocí value (LINQ) a vezmeš si první pár a z něho klíč a nebo použiješ to co máš teď a jen vyhledáš barvu, která se schoduje s tvým klíčem.
Color color = farby.OrderByDescending( d => d.Value).First().Key;
Každopádně řekni co ti to hází za vyjímku, normalně by jsi měl být schopný brát i pixel [0,0]
David Hartinger to už snad děláš naschvál ne?:D
Nemáš zač, když se budeš snažit a pošleš nějaký kód, tak ti tu
vždycky někdo rád pomůže. Nemáme ale rádi, když máme někomu něco
celé programovat
Zobrazeno 31 zpráv z 31.