Programátorská sociální síť a materiálová základna pro C#, Java, PHP, HTML, CSS, JavaScript a další.

Přihlásit se Registrace  
Zveme vás v pátek na sraz komunity devbooku.
05.07.2012 19:57:31
Avatar
Fugiczek
Redaktor
DotDotDotDotDotDotDotDotDotDot

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

05.07.2012 20:12:38
Avatar
David Čápka
Moderátor
DotDotDotDotDotDotDotDotDotDot
Odpovídá na Fugiczek

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   i++; | i--;
Metal is the transitional element for the construction of Artifact Vessels.
05.07.2012 20:19:48
Avatar
Fugiczek
Redaktor
DotDotDotDotDotDotDotDotDotDot

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

05.07.2012 20:24:01
Avatar
matesax
Redaktor
DotDotDotDotDotDotDotDotDotDot
Odpovídá na Fugiczek

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

05.07.2012 20:31:00
Avatar
David Čápka
Moderátor
DotDotDotDotDotDotDotDotDotDot
Odpovídá na Fugiczek

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   i++; | i--;
Metal is the transitional element for the construction of Artifact Vessels.
05.07.2012 20:32:53
Avatar
Kit
Redaktor
DotDotDotDotDotDotDotDotDotDot
Odpovídá na David Čápka

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   i++; | i--;
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
05.07.2012 20:34:29
Avatar
Kit
Redaktor
DotDotDotDotDotDotDotDotDotDot
Odpovídá na matesax

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

Odpovědět   i++; | i--;
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
05.07.2012 20:37:11
Avatar
Kit
Redaktor
DotDotDotDotDotDotDotDotDotDot
Odpovídá na David Čápka

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

Odpovědět   i++; | i--;
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
05.07.2012 20:38:02
Avatar
David Čápka
Moderátor
DotDotDotDotDotDotDotDotDotDot
Odpovídá na Kit

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   i++; | i--;
Metal is the transitional element for the construction of Artifact Vessels.
05.07.2012 20:41:59
Avatar
Fugiczek
Redaktor
DotDotDotDotDotDotDotDotDotDot

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

05.07.2012 20:46:57
Avatar
David Čápka
Moderátor
DotDotDotDotDotDotDotDotDotDot
Odpovídá na Fugiczek

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   i++; | i--;
Metal is the transitional element for the construction of Artifact Vessels.
05.07.2012 20:49:51
Avatar
Kit
Redaktor
DotDotDotDotDotDotDotDotDotDot
Odpovídá na David Čápka

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   i++; | i--;
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
05.07.2012 20:55:02
Avatar
Fugiczek
Redaktor
DotDotDotDotDotDotDotDotDotDot

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

05.07.2012 20:58:07
Avatar
Kit
Redaktor
DotDotDotDotDotDotDotDotDotDot
Odpovídá na David Čápka

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   i++; | i--;
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
05.07.2012 21:01:56
Avatar
David Čápka
Moderátor
DotDotDotDotDotDotDotDotDotDot
Odpovídá na Kit

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   i++; | i--;
Metal is the transitional element for the construction of Artifact Vessels.
05.07.2012 21:02:15
Avatar
Kit
Redaktor
DotDotDotDotDotDotDotDotDotDot
Odpovídá na Fugiczek

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   i++; | i--;
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
05.07.2012 21:06:00
Avatar
Fugiczek
Redaktor
DotDotDotDotDotDotDotDotDotDot
Odpovídá na Kit

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

05.07.2012 21:06:12
Avatar
Kit
Redaktor
DotDotDotDotDotDotDotDotDotDot
Odpovídá na David Čápka

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   i++; | i--;
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
05.07.2012 21:09:41
Avatar
Kit
Redaktor
DotDotDotDotDotDotDotDotDotDot
Odpovídá na Fugiczek

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   i++; | i--;
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
05.07.2012 21:59:17
Avatar
Fugiczek
Redaktor
DotDotDotDotDotDotDotDotDotDot

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

05.07.2012 23:06:09
Avatar
David Čápka
Moderátor
DotDotDotDotDotDotDotDotDotDot
Odpovídá na Kit

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   i++; | i--;
Metal is the transitional element for the construction of Artifact Vessels.
05.07.2012 23:06:53
Avatar
David Čápka
Moderátor
DotDotDotDotDotDotDotDotDotDot
Odpovídá na Fugiczek

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

Odpovědět   i++; | i--;
Metal is the transitional element for the construction of Artifact Vessels.

 

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.