Diskuze: Pomoc s List
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Tvůrce

Zobrazeno 22 zpráv z 22.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
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í
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é
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.
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é.
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 ) 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
To je dost možné, protože tohle fakt nevypadá na to, že by to psal
člověk 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é
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é.
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().
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.
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.
Já se zatím nikdy s Listem v Listu nikdy nesetkal tak mě to trochu
překvapilo
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ě".
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.
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
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.
Na první pohled to vypadá dobře, na druhý jsem moc ospalý
Zobrazeno 22 zpráv z 22.