

Java - FastUtil - stream
Dobrý den,
S poli pracuji výhradně pomocí streamu.
Avšak původní třídu ObjectArrayList (ArrayList pomocí knihovny FastUtil), která stream umožňovala, jsem musel přepsat na Int2ObjectArrayMap, což je vlastně variace asociovaného pole int -> object, která však stream neumožňuje.
S touhle knihovnou moc dlouho nedělám a asociované pole jsem objevil teprve nedávno, takže moc tomu nerozumím.
Proto se chci, prosím Vás, zeptat, jestli je možné něco udělat proto, abych stream mohl použít nebo to obejít jinou variantu, abych nemusel používat cyklus for each?
Děkuji.
A pres co chces iterovat? Mas tam metody keySet() a values() ktere vraci instance, ktere uz stream() umoznuji...
Aha. values() potřebuji. Je to celkem logické, to mě mohlo napadnout. Díky.
Ještě bych se chtěl, prosím Vás, zeptat, jestli existuje oboustranná vazba mezi klíčem a hodnotou, respektive jestli je možné pomocí hodnoty určit klíč?
Ano, ale treba iteraci pres EntrySet. Vzhledem k tvym use-cases to docela zavani spatne zvolenou datovou strukturou...
Zavání špatně zvolenou strukturou?
No, jak jsem už na začátku napsal, původně jsem měl ObjectArrayList. Prvky v tomto poli měli mezi sebou určité vazby(odkazy), které byly natvrdo napsané do jejich fieldu(pole).
Takový zápis je ale nevhodný na zprávu a testování, proto jsem to přepsal na metodu, která to vyřeší. K tomu využívala index prvku v poli. Např. 2 měla odkaz na 4 a 6 (čistě jako příklad).
Jelikož ale v programu musím procházet celé pole, tak jsem chtěl zbytečné prvky odstranit. Abych využil ten příklad výše, když nastavím 2, tak je 4 a 6 zbytečná a chci je odstranit.
Problém však nastává, kdybych třeba pomocí jiné vazby jiného prvku odstranil 5 a všechno s indexem 6 a výše by se muselo o 1 snížit.
Kdybych potom pomocí 2 odstranil 4 a 6 prvek, tak ve skutečnosti odstraním 4 a původní 7 prvek, což je špatně.
Proto jsem to přepsal na Int2ObjectArrayMap, kde tento problém nenastává.
Jenže hned potom mi začalo IDE řvát, že nezná stream() a teď se dostáváme na začátek mého dotazu.
Takže jestli jsem to snad dobře vysvětlil a Vy jste pochopil o co mi jde, jakou datovou strukturu by jste mně, prosím Vás, doporučil?
Int2ObjectArrayMap je hlavne mapa, takze se pres ni nema iterovat, ale prvky se maji vytahovat podle klice...
Z tveho popisu mi neni moc jasny tvuj objektovy model. To mas jako prvek, ktery ma vazbu na jine prvky? Proc teda nevymodelujes strom? Prvek bude mit odkaz na kolekci zavislych prvku.
Tak jsem to vyřešil jinak.
Pole jsem vrátil zpátky na ObjectArrayList a prvkům jsem přidal číslo podle pořadí při vytváření jako konstantní field.
A pak ty prvky vybírám právě podle tohoto fieldu, takže při mazání prvků k žádné záměně nedojde.
Na druhou stranu musím projet celé pole, abych našel potřebné prvky, ale při jeho velikosti, která se bude ještě postupně zmenšovat, to žádný problém není.
Jen jsem se chtěl ještě zeptat, zda je lepší procházet ArrayList nebo HashSet? Vyhnout se duplicitám ani získávat pole pomocí indexu nepotřebuji, takže můžu použít obojí.
I tak mě zajímalo, co je rychlejší procházet.
hash-set-and-array-list-performances
V první odpovědi je napsané, že HashSet je rychlejší. I tak by se chtěl zeptat, co si o tom myslíte Vy?
Díky.
A o jakych poctech prvku se bavime?
250. Já vím, není to moc, ale u té dříve zmíněné odpovědi je právě napsané, že je to rychlejší už při nízkém počtu prvků.
Smaria pano. Kvuli 250 prvkum jsi tam narval osmnactimegove jarko nejake obskurni knihovny??? Proc nepouzijes normalne kolekce z JDK? Rozdil nepoznas. Docela jsi pobavil...
Upřímně jsem takovou odpověď čekal. Ale chápu to, až na tu druhou větu. Neřekl jsem ani slovo o tom, že je to jediné pole v mém programu, takže si zase pobavil ty mě tímhle závěrem.
Takže díky za všechno a měj se.
Beztak to nepotrebujes...