Oszt egy listát részekre Kotlinban

1. Bemutatkozás

Tegyük fel, hogy van egy ilyen tömbünk [a, b, c, d, e, f] és szeretnénk az elemeket külön csoportokra bontani, mint a [[a, b], [c, d], [e, f]] vagy [[a, b, c], [d], [e, f]].

Ebben az oktatóanyagban ezt el fogjuk érni, miközben megvizsgáljuk a Kotlinék közötti különbségeket csoportosítva, darabokban, és ablakos.

2. A lista felosztása párok listájára

Példáinkhoz két listát fogunk használni - az egyik páros számú, a másik pedig páratlan számú elemet tartalmaz:

val evenList = listOf (0, "a", 1, "b", 2, "c"); val unevenList = listOf (0, "a", 1, "b", 2, "c", 3);

Nyilvánvaló, hogy fel tudjuk osztani a sajátunkat evenList pontosan három párba. Azonban a mi unevenList egy extra eleme lesz.

A szakasz további részében különféle megvalósításokat fogunk látni a két listánk felosztásához, beleértve azt is, hogy miként kezelik az extra elemet a unevenList.

2.1. Használata csoportosít

Először valósítsunk meg egy megoldást g-velroupBy. Hozunk létre egy listát növekvő számokkal és felhasználással csoportosít hogy szétválasszák őket:

val numberList = listOf (1, 2, 3, 4, 5, 6); numberList.groupBy {(it + 1) / 2} .values

Ez megadja a kívánt eredményt:

[[1, 2], [3, 4], [5, 6]]

Hogyan működik? Jól, csoportosít végrehajtja a mellékelt funkciót (it + 1) / 2 minden elemen:

  • (1 + 1) / 2 = 1
  • (2 + 1) / 2 = 1,5, amelyet 1-re kerekítenek
  • (3 + 1) / 2 = 2
  • (4 + 1) / 2 = 2,5, amelyet 2-re kerekítenek
  • (5 + 1) / 2 = 3
  • (6 + 1) / 2 = 3,5, amelyet 3-ra kerekítenek

Azután, csoportosít csoportosítja a lista azon elemeit, amelyek ugyanazt az eredményt adták.

Most, amikor ugyanezt tesszük egyenetlen listával:

val numberList = listOf (1, 2, 3, 4, 5, 6, 7); numberList.groupBy {(it + 1) / 2} .values

Megkapjuk az összes párot és egy extra elemet:

[[1, 2], [3, 4], [5, 6], [7]]

De, ha valamivel véletlenszerűbb számokkal megyünk tovább:

val numberList = listOf (1, 3, 8, 20, 23, 30); numberList.groupBy {(it + 1) / 2} .values

Kapunk valamit, ami teljesen nem kívánatos:

[[1], [3], [8], [20], [23], [30]]

Az ok egyszerű; a (it + 1) / 2 funkció minden elemre a következőket adja: 1, 2, 4, 10, 12, 15. Az összes eredmény eltér, ezért egyetlen elem sem csoportosul.

Amikor a mi evenList vagy unevenList, még rosszabb - a kód nem áll össze, mivel a függvény nem alkalmazható Húrok.

2.2. Használata csoportosít és azIndex-szel

Tényleg, ha tetszőleges listát akarunk párokba csoportosítani, nem akarjuk módosítani a érték funkciónk szerint, de a index:

evenList.withIndex () .groupBy {it.index / 2} .map {it.value.map {it.value}}

Ez megadja a kívánt párok listáját:

[[0, "a"], [1, "b"], [2, "c"]]

Továbbá, ha a unevenList, még külön elemünket is megkapjuk:

[[0, "a"], [1, "b"], [2, "c"], [3]]

2.3. Használata csoportosít Val vel foldIndexed

Haladhatunk egy lépéssel tovább, mint a használat index és még egy kicsit programozni foldindexed néhány allokáció mentéséhez:

evenList.foldIndexed (ArrayList(evenList.size / 2)) {index, acc, item -> if (index 2% == 0) {acc.add (ArrayList (2))} acc.last (). add (elem) acc}

Míg egy kicsit bőbeszédűbb, a foldindexed megoldás egyszerűen elvégzi a műveletet az egyes elemeken, míg a azIndex-szel A function először iterátort hoz létre, és minden elemet beburkol.

2.4. Használata darabos

De ezt elegánsabban meg tudjuk csinálni darabos. Tehát alkalmazzuk a módszert a sajátunkra evenList:

evenList.chunked (2)

A evenList biztosítja a kívánt párokat:

[[0, "a"], [1, "b"], [2, "c"]]

Amíg a unevenList megadja nekünk a párokat és az extra elemet:

[[0, "a"], [1, "b"], [2, "c"], [3]]

2.5. Használata ablakos

És darabos nagyon jól működik, de néha egy kicsit nagyobb ellenőrzésre van szükségünk.

Például meg kell adnunk, hogy csak párokat akarunk-e, vagy ha fel akarjuk venni az extra elemet. A ablakos módszer biztosítja számunkra a részleges Windows Logikai, amely jelzi, hogy a részeredményt akarjuk-e vagy sem.

Alapértelmezés szerint, részleges Windows van hamis. Tehát a következő állítások ugyanazt az eredményt hozzák:

evenList.windown (2, 2) unevenList.windown (2, 2, hamis)

Mindkettő külön elem nélkül adja vissza a listát:

[[0, "a"], [1, "b"], [2, "c"]]

Végül, amikor beállítottunk részleges Windows nak nek igaz tartalmazza a részeredményt:

unevenList.windown (2, 2, igaz)

Megkapjuk a párok listáját és a külön elemet:

[[0, "a"], [1, "b"], [2, "c"], [3]]

3. Következtetés

Használata csoportosít egy szép programozási gyakorlat, de meglehetősen hibára hajlamos lehet. Néhány hiba egyszerűen megoldható az an használatával index.

A kód optimalizálásához akár használhatjuk is foldindexed. Ez azonban még több kódot eredményez. Szerencsére a darabos metódus ugyanazt a funkcionalitást kínálja nekünk out-of-the-box.

Sőt, a ablakos metódus további konfigurációs opciókat biztosít. Ha lehetséges, a legjobb, ha a darabos metódus, és ha további konfigurációra van szükségünk, akkor a ablakos módszer.

Szokás szerint a teljes forráskód elérhető a GitHubon.