Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Fugiczek
Tvůrce
Avatar
Fugiczek:5.7.2012 19:57

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 19:57
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Fugiczek
David Hartinger:5.7.2012 20:12

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

Nahoru Odpovědět
5.7.2012 20:12
You are the greatest project you will ever work on.
Avatar
Fugiczek
Tvůrce
Avatar
Fugiczek:5.7.2012 20:19

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

 
Nahoru Odpovědět
5.7.2012 20:19
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Fugiczek
matesax:5.7.2012 20:24

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

 
Nahoru Odpovědět
5.7.2012 20:24
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Fugiczek
David Hartinger:5.7.2012 20:31

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

Nahoru Odpovědět
5.7.2012 20:31
You are the greatest project you will ever work on.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:5.7.2012 20:32

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.

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

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

Nahoru Odpovědět
5.7.2012 20:34
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:5.7.2012 20:37

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

Nahoru Odpovědět
5.7.2012 20:37
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Kit
David Hartinger:5.7.2012 20:38

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é.

Nahoru Odpovědět
5.7.2012 20:38
You are the greatest project you will ever work on.
Avatar
Fugiczek
Tvůrce
Avatar
Fugiczek:5.7.2012 20:41

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

 
Nahoru Odpovědět
5.7.2012 20:41
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Fugiczek
David Hartinger:5.7.2012 20:46

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

Nahoru Odpovědět
5.7.2012 20:46
You are the greatest project you will ever work on.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:5.7.2012 20:49

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é.

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

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

 
Nahoru Odpovědět
5.7.2012 20:55
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:5.7.2012 20:58

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().

Nahoru Odpovědět
5.7.2012 20:58
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Kit
David Hartinger:5.7.2012 21:01

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.

Nahoru Odpovědět
5.7.2012 21:01
You are the greatest project you will ever work on.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Fugiczek
Kit:5.7.2012 21:02

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.

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

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

 
Nahoru Odpovědět
5.7.2012 21:06
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:5.7.2012 21:06

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ě".

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

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.

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

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

 
Nahoru Odpovědět
5.7.2012 21:59
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Kit
David Hartinger:5.7.2012 23:06

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.

Nahoru Odpovědět
5.7.2012 23:06
You are the greatest project you will ever work on.
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Fugiczek
David Hartinger:5.7.2012 23:06

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

Nahoru Odpovědět
5.7.2012 23:06
You are the greatest project you will ever work on.
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 22 zpráv z 22.