Facebook RSS feed
Zveme vás v pátek 31.10. na vánoční sraz komunity itnetwork.
Avatar
Fugiczek
Redaktor
Avatar
Fugiczek:

Pročítám si různé zdrojové kódy a nemůžu přijít tomutu na kloub, rád bych kdyby mi to někdo vysvětlil :)

List arr = new ArrayList();
 List tmpArr = Arrays.asList(content.split(";"));

content je String v takovéto podobě:

0041734632887/111076/1341517521/1341496724/840282458/0/0/4/78/1800/364/52088/-1/5/26/1/0/2/105/105/7/106/7/2/9/1/0/2/1/2/14/17/29/20/22/0/0/2/0/6/0/0/6/4/2/0/2/0/0/0/0/0/0/0/0/0/0/0/0/0/3/1001/2/0/5/3/1/0/0/0/24/0/0/0/0/0/0/0/0/0/0/0/0/0/4/1001/12/0/2/1/5/0/0/0/52/0/8/3/0/0/3/1/5/2/0/0/10/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/1/1001/6/22/5/3/4/6/0/0/65/0/0/0/0/0/0/0/0/0/0/0/0/0/0/1001/8/10/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/1341504721/4/4/4/4/6/1/-23/-134/-7/12/8/12/400/200/400/0/1001/3/0/5/4/3/3/0/0/120/0/10/3/0/0/1/5/4/7/5/0/139/0/7/1001/4/0/3/4/5/0/0/0/55/0/581/308/353/100/20/63/0/1341497802/4/1001/3/0/5/2/4/0/0/0/27/0/3/1001/2/0/4/2/1/0/0/0/24/0/1/1002/12/32/4/3/5/0/0/0/47/1/7/1001/3/0/2/4/3/0/0/0/26/0/7/1001/1/0/4/2/1/0/0/0/22/0/1/1001/15/29/1/2/4/8/0/0/190/1/1341496822/8/1/0/0/1/4/2/2/0/0/50/0/8/5/0/0/2/3/4/2/0/0/50/0/8/3/0/0/2/3/4/2/0/0/50/0/8/6/0/0/5/3/1/2/0/0/50/0/8/3/0/0/2/3/4/2/0/0/50/0/12/5/0/0/11/5/0/72/10/0/19/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/14/6/22/0/0/0/0/0/1341496735/4740/0/0/0/1341504575/0/0/1/1341496810/4/0/3/8/0/316/364/0/0/5/0/0/1/1341503975/0/0/0/0/0/0/0/0/0/0/0/120/0/0/0/0/0/0/0/0/0/0/0/0/840282458/840282458/840282458/0/0/0/0/1341517521

dále se pokračuje

String t;
         for(Iterator iterator = tmpArr.iterator(); iterator.hasNext(); arr.add(Arrays.asList(t.split("/"))))
         {
             t = (String)iterator.next();
             t = t.trim();
         }

Pak se k číslům přistupuje nějak takto

level = Integer.valueOf(Integer.parseInt((String)((List)arr.get(0)).get(7)));

2x get() za sebou? Jsem nějak nepochytil. Možná když by byl List v Listu.
Chtěl bych aby mi někdo vysvětlil co se v tom cyklu for-each děje a jak bych měl pochopit to přistupování k číslům. Doufám že se nějaká dobrá duše najde :D

 
Odpovědět 5.7.2012
Avatar
David Čápka
Moderátor
Avatar
Odpovídá na Fugiczek
David Čápka:

To tam máš, 3. parametr v tom cyklu:

arr.add(Arrays.asList(t.split("/")))

Vloží se tedy list do listu. Každopádně se mi ten kód ani trochu nelíbí :D

Odpovědět 5.7.2012
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
Fugiczek
Redaktor
Avatar
Fugiczek:

No mě se ten kód taky vůbec nelíbí, nejdřív ho chci pořádně pochopit a pak si ho přepsat podle sebe do pohodlnější verze :)
Mě by taková prasárna nikdy nenapadla... no ikdyž možná jo... :D

 
Odpovědět 5.7.2012
Avatar
matesax
Redaktor
Avatar
Odpovídá na Fugiczek
matesax:

Použij regulérní výraz,...

 
Odpovědět 5.7.2012
Avatar
David Čápka
Moderátor
Avatar
Odpovídá na Fugiczek
David Čápka:

V Javě moc nedělám, ale zkusím to:

Vytvořím si 2 listy, první prázdný, druhý má v sobě Stringy vzniklé splitnutím toho dlouhého řetězce. Splituje se dle středníku, v řetězci jsou lomena, což mi trochu nesedí, ale předpokládám, že je v reálu ještě delší i se středníky.

Následuje příšerný cyklus, kde se iteruje druhý list (ten do kterého se splitovalo). Nechápu, proč tam není foreach nebo se v Javě iteruje takhle? To snad ne.
Každopádně iteruji druhý list a v každém kroku vložím do prvního listu splitnutý String t, ten v každé iteraci obsahuje prvek druhého listu, splitovaný dle lomítka.

Suma sumárum, dle mého názoru (ale klidně můžu kecat, tohle je fakt šílenost) to dělá následující:

Zadám takovýto string: "1/2/3;4/5/6;7/8/9" o on mi vrátí list se třemi prvky, kde každý prvek je list třech prvků. V závorkové notaci to vypadá takto: list(list(1, 2, 3), list(4, 5, 6), list(7, 8, 9)).

Pokud to takto opravdu funguje, je to příšerně napsané :O

Odpovědět 5.7.2012
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:

List v listu je celkem běžná záležitost - třeba v Lispu je to snad v každé aplikaci. Ovšem v daném případě to asi nebude správně.

Pojmenování seznamu "arr" vidím spíš jako matení nepřítele, použití "for" na procházení seznamu také. Split(";") na řetězci bez středníku je rovněž zajímavý. Nejlépe asi bude hledat příklady jinde.

Odpovědět 5.7.2012
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na matesax
Kit:

Co je to "regulérní výraz"? Znám jen regulární výrazy.

Odpovědět 5.7.2012
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Obávám se, že jsi to pochopil správně.

Odpovědět 5.7.2012
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Moderátor
Avatar
Odpovídá na Kit
David Čápka:

Já nenarážím na list v listu, ale na způsob iterace, to je jak v pravěku :)

Ale když už o tom mluvíme, mám raději přehledné struktury, s Davidem máme v těch kvízech tady 4 rozměrné pole (PHPčkové pole, tedy seznam/list) a nikdo už neví, co je kde uložené. Kolují legendy, co který index značí, kdo ví. Každopádně kdybychom udělali raději list objektů, bylo by vše jasné. Čím déle programuji, tím více zjišťuji, jak je procedurální myšlení špatné.

Odpovědět 5.7.2012
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
Fugiczek
Redaktor
Avatar
Fugiczek:

Díky všem za pomoc a za jejich rady :) Zítra se na to vrhnu.
To matesax: regulární výrazy, tohle už mi kdysi radil i sczdavos, ještě jsem neměl čas se na to podívat, ale když to radí už druhej člověk tak to bude asi dost podstatné :)
To sdraco: no mě ani tak nešlo jak ten kód je napsanej, já to hlavně potřeboval ke zjištění jedné informace která se blbě zjišťuje (bota v Javě na browser hry dělá málo kdo :D ) a taky ten kód není získanej zrovna mírumilovnou cestou ]:> Možná to ten decompiler jen špatně přeložil (to se stává hodně často) ale kód přeloženej funguje a mě šlo jen o princip :)

 
Odpovědět 5.7.2012
Avatar
David Čápka
Moderátor
Avatar
Odpovídá na Fugiczek
David Čápka:

To je dost možné, protože tohle fakt nevypadá na to, že by to psal člověk :D On se foreach v reálu překládá na práci s iterátorem, to bude ono.

Regulární výrazy jsou zejména na práci se složitějšími podřetězci, tady jsou jen 2 separátory, naopak by zde byly na škodu. Jedná se v podstatě o jazyk v jazyku, interpretace je velmi časově náročná (vlastně se v paměti postaví stroj na reg. výrazy). Zde stačí jen jednoduchý split v cyklu. Nicméně jestli reguláry neumíš, určitě si znalosti doplň, jsou velmi důležité :)

Odpovědět 5.7.2012
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:

Však právě. Zjistil jsem, že pracovat s listem v listu jako s dvourozměrným polem je blbost.

Pole v PHP jsou de facto seznamy a slovníky. Pracovat s tím jako s vícerozměrným polem je cestou do pekel. Už použití jednoduchého indexu u takového "pole" je podezřelé.

Odpovědět 5.7.2012
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Fugiczek
Redaktor
Avatar
Fugiczek:

To sdraco: díky za objasnění a reguláry doplňím :)
To Kit: on ten contant je pokaždé jiný, někdy ty ; tam jsou, záleží na jakou adresu zrovna je požadavek poslaný :) Já zrovna poskytl příklad kde žádný středník není :)

 
Odpovědět 5.7.2012
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Tak si zkus udělat bez iterátoru tohle:

<?php
$pole=array();
$pole[1]="a ";
$pole[5]="b ";
foreach($pole as $item){
   echo $item;
}

Netvrdím, že to nejde, ale je to pakárna.

Souhlasím, že regulární výrazy jsou na takovou trivialitu overkill. Přednost by měla mít metoda split().

Odpovědět 5.7.2012
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Moderátor
Avatar
Odpovídá na Kit
David Čápka:

Asi jsi mě špatně pochopil, myslel jsem, že se konstrukce foreach() ve zdrojovém kódu při kompilaci přeloží JavaC jako for cyklus, který pracuje s iterátorem. Proto se při dekompilaci již nepřeloží zpět.

Člověk samozřejmě používá foreach.

Odpovědět 5.7.2012
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 Fugiczek
Kit:

V tom případě se tedy skutečně jedná o dvourozměrný seznam. Mělo by se s ním tak i zacházet. Ovšem pokud potřebuji 8. prvek z 1. záznamu, zní dvojitý get docela logicky.

Odpovědět 5.7.2012
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Fugiczek
Redaktor
Avatar
Odpovídá na Kit
Fugiczek:

Já se zatím nikdy s Listem v Listu nikdy nesetkal tak mě to trochu překvapilo :)

 
Odpovědět 5.7.2012
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

Pochopil jsem tě správně, jen jsem ti uvedl příklad, kdy to tak kompilátor udělat nemůže. Schválně si to zkus s "for", není to žádná sranda.

Je však možné, že i autor to napsal "divně".

Odpovědět 5.7.2012
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Fugiczek
Kit:

List v listu je častější, než by sis myslel. Adresářová struktura, soubor XML, ... Dokonce to mívá desítky úrovní zanoření a všechno jsou to jen seznamy v seznamech.

Odpovědět 5.7.2012
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Fugiczek
Redaktor
Avatar
Fugiczek:

Co myslíte? Je to takhle lepší?

List arr = new ArrayList();
 List tmpArr = Arrays.asList(content.split(";"));
 for(Object s: tmpArr)
         {
             arr.add(Arrays.asList(((String) s).split("/")));
         }

Jsem to jenom narychlo zkusil přepsat v tom dekompilovaném kódě. Ve své přepsané verzi to přepíšu na genericitní typy :)

 
Odpovědět 5.7.2012
Avatar
David Čápka
Moderátor
Avatar
Odpovídá na Kit
David Čápka:

Pořád si nerozumíme, měl jsem na mysli přeložení pro for cyklus, který si vezme iterátor objektu (zde pole, tedy seznamu) a volá na tomto iterátoru metodu next(). Ne for cyklus, který bude po jednom indexovat.

Takhle vnitřne funguje foreach, pole vystavuje objekt iterátor, který má getter na aktuální prvek a metodu next() pro posun na další. Ta nejlépe ví, jak to vnitřně zařídit a my ji jen voláme. Foreach konstrukce je jen syntactic sugar.

Odpovědět 5.7.2012
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
Moderátor
Avatar
Odpovídá na Fugiczek
David Čápka:

Na první pohled to vypadá dobře, na druhý jsem moc ospalý ;)

Odpovědět 5.7.2012
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.

 

Zobrazeno 22 z 22 zpráv

Přidat novou zprávu

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řihlaš. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.