Diskuze: Najviac opakovaná položka v Liste

C# .NET .NET (C# a Visual Basic) Najviac opakovaná položka v Liste American English version English version

Aktivity (1)
Avatar
roks
Člen
Avatar
roks:8.9.2013 12:15

Zdravím, vedel by mi niekto poradiť, ako spraviť, alebo aký príkaz je na to, keď chcem zistiť, aká položka sa najviac vyskytuje v Liste?

 
Odpovědět 8.9.2013 12:15
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na roks
David Čápka:8.9.2013 12:19

Na všechno není příkaz, někdy se musí zapojit mozek :P Musíš si někam ukládat počet položek.

Nahoru Odpovědět 8.9.2013 12:19
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Theodor Johnson
Redaktor
Avatar
Nahoru Odpovědět 8.9.2013 12:31
Přecházím na "Cross-Platform Development"
Avatar
roks
Člen
Avatar
Odpovídá na David Čápka
roks:8.9.2013 12:32

Ale došli mi nápady, lebo potrebujem, aby mi ukázalo najviac nájdený pixel v bitmape...

 
Nahoru Odpovědět 8.9.2013 12:32
Avatar
Gelidus
Člen
Avatar
Gelidus:8.9.2013 12:41

Čo spraviť miesto Listu Dictionary s keyom - hashu tej farby (int) a value -počtom?

 
Nahoru Odpovědět 8.9.2013 12:41
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na roks
Jan Vargovský:8.9.2013 12:50

Histogram nebo přímo jednotlivých barev?

 
Nahoru Odpovědět  +1 8.9.2013 12:50
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na roks
David Čápka:8.9.2013 12:51

To ukládáš každý pixel do listu? To snad ne. Lepší by bylo kdybys napsal co chceš vůbec udělat.

Nahoru Odpovědět 8.9.2013 12:51
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:8.9.2013 13:04

To sis ještě nezvykl, že se místo pole často chybně používá seznam a naopak?

Nahoru Odpovědět 8.9.2013 13:04
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Kit
David Čápka:8.9.2013 13:12

Tohle je spíš na slovník, kde jsou klíčem barvy a hodnotou počet pixelů.

Nahoru Odpovědět 8.9.2013 13:12
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:8.9.2013 13:22

To je fakt, barev je v TrueColor víc než pixelů na obrazovce.

Nahoru Odpovědět 8.9.2013 13:22
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
roks
Člen
Avatar
Odpovídá na David Čápka
roks:8.9.2013 13:27

Ukladám každý pixel do listu, pretože potrebujem, aby pixel, ktorý sa najviac vyskytuje v Bitmap-e bol priehľadný :)

 
Nahoru Odpovědět 8.9.2013 13:27
Avatar
roks
Člen
Avatar
Odpovídá na Jan Vargovský
roks:8.9.2013 13:28

Priamo jednotlivých farieb, resp. pixelov

 
Nahoru Odpovědět 8.9.2013 13:28
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na roks
David Čápka:8.9.2013 13:29

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.

Nahoru Odpovědět 8.9.2013 13:29
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na roks
David Čápka:8.9.2013 13:29

Kdybys nevěděl jak se s ním zachází, je to popsané detailně tady: http://www.itnetwork.cz/…ziny-hashset

Nahoru Odpovědět 8.9.2013 13:29
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
roks
Člen
Avatar
Odpovídá na David Čápka
roks:8.9.2013 13:48

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?

 
Nahoru Odpovědět 8.9.2013 13:48
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na roks
David Čápka:8.9.2013 13:49

Ne do množiny, do slovníku. Ty jsi to nečetl.

Nahoru Odpovědět 8.9.2013 13:49
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
roks
Člen
Avatar
Odpovídá na David Čápka
roks:8.9.2013 14:07

Čítal, ale (keďže nemám toľko vedomostí ako ostatný na tejto stránke) neviem si predstaviť, ako by to fungovalo. :(

 
Nahoru Odpovědět  -1 8.9.2013 14:07
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na roks
David Čápka:8.9.2013 14:33

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šší.

Nahoru Odpovědět 8.9.2013 14:33
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
roks
Člen
Avatar
Odpovídá na David Čápka
roks:8.9.2013 15:23

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šší :(

 
Nahoru Odpovědět 8.9.2013 15:23
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na roks
David Čápka:8.9.2013 15:32

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.

Editováno 8.9.2013 15:33
Nahoru Odpovědět 8.9.2013 15:32
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na roks
Jan Vargovský:8.9.2013 15:32
farba[clr]++;
 
Nahoru Odpovědět 8.9.2013 15:32
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Jan Vargovský
David Čápka:8.9.2013 15:33

o 2 sekundy rychlejší :D

Nahoru Odpovědět 8.9.2013 15:33
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na David Čápka
Jan Vargovský:8.9.2013 15:34

Zrovna nato čumím no, odesílalo se to tak 5 sekund, jinak bych byl rychlejší já :D

 
Nahoru Odpovědět 8.9.2013 15:34
Avatar
roks
Člen
Avatar
roks:8.9.2013 15:49

Nebudem dávať odpoveď, vďaka obom za pohotovú odpoveď :) a už len priehľadnú farbu zvolím:
Color priehladnaFarba = farby.Keys.Max(); ? :)

 
Nahoru Odpovědět 8.9.2013 15:49
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na roks
Jan Vargovský:8.9.2013 15:52

Ano. Však si to zkus, nemusíš se ptát na všechno :)

Pozn. Proč ignoruješ levý sloupec pixelů ? (začínáš s y = 1)

Editováno 8.9.2013 15:54
 
Nahoru Odpovědět 8.9.2013 15:52
Avatar
roks
Člen
Avatar
roks:8.9.2013 15:57

Ide o to, že som to skúsil a nejde mi to :/

Color priehladnaFarba = farby.Keys.Max();

píše mi toto: "At least one object must implement IComparable."

 
Nahoru Odpovědět 8.9.2013 15:57
Avatar
roks
Člen
Avatar
Odpovídá na Jan Vargovský
roks:8.9.2013 16:02

Lebo keď dám y = 0, tak pixel 0, 0 mi hneď vyhodí chybu :)

 
Nahoru Odpovědět 8.9.2013 16:02
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na roks
David Čápka:8.9.2013 16:21

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.

Nahoru Odpovědět 8.9.2013 16:21
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na roks
Jan Vargovský:8.9.2013 16:22

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 Čápka to už snad děláš naschvál ne?:D

Editováno 8.9.2013 16:25
 
Nahoru Odpovědět 8.9.2013 16:22
Avatar
roks
Člen
Avatar
roks:8.9.2013 16:29

Aha, tak to ma nenapadlo :) tak Vám ďakujem za ochotu :)

 
Nahoru Odpovědět 8.9.2013 16:29
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na roks
David Čápka:8.9.2013 16:44

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 :)

Nahoru Odpovědět  +1 8.9.2013 16:44
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
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 31 zpráv z 31.