Уау, можеш ли да повярваш, че вече сме в нашата пета част от тази поредица? Ако сте нов в тази поредица, горещо препоръчвам да се върнете към въведението, тъй като всяка част се основава на предишните части. В четвърта част ще продължим да изучаваме контролните потоци, като научим за другите цикли в Kotlin. Въпреки това, преди да започнем, уверете се, че сте създали нов пакет с име part_004 и създайте нов файл на Kotlin с име app. Страхотно, да започваме.

В този пример ще отпечатаме списък с автомобили, използвайки три различни подхода. За да получите списък с автомобили, търсени за „най-добрите спортни автомобили 2017“ и „намерих тази статия в „Кола и шофьор“. Чувствайте се свободни да откраднете моя списък или да измислите свой собствен. Първата ни стъпка в създаването на тази програма е като създадем масив от String обекти. За моята програма изглежда така:

val cars = arrayOf(
        "Toyota Camry",
        "Toyota Corolla",
        "Honda Civic",
        "Nissan Altima",
        "Honda Accord",
        "Hyundai Elantra",
        "Nissan Sentra",
        "Ford Fusion",
        "Chevrolet Cruze",
        "Hyundai Sonata",
        "Ford Focus",
        "Mazda MX-5 Miata",
        "Fiat 124 Spider",
        "Subaru BRZ",
        "Toyota 86",
        "Nissan Z",
        "Dodge Challenger",
        "Ford Mustang",
        "Chevrolet Camaro",
        "Audi TT / TTS"
)

Може би се чудите точно сега какво е arrayOf или дори какво е array. За да отговорите на първия въпрос, arrayOf ви позволява да създадете array обекти, в този случай те са низове. За да отговоря на втория въпрос, масивът е колекция от обекти. Тази колекция обикновено ще има известна прилика, в този случай искаме да представим списък с имена на автомобили. Също така вероятно е важно да се отбележи, че всеки елемент е разделен със запетая ,, като новият ред не е задължителен (но може да помогне за четимостта на по-дълги масиви).

Докато навлизаме по-нататък в тази поредица, ще обсъдим други видове колекции заедно с предимствата и недостатъците им. Като цяло масивът е най-основният тип колекция и служи като градивни елементи на няколко други. Въпреки че това може да попадне в „Твърде много информация Коди!“ Искам също така да отбележа, че по принцип приложенията работят с масиви от неща. Стената ви във Facebook се захранва от масив от Posts, Medium се захранва от масив от Articles, а YouTube се захранва от масив от Videos. Това не са точните реализации, а вместо това са опростени примери.

След като приключим с това, нека започнем да отпечатваме тези коли.

Основният For цикъл

Така че сега е време да прегледате този списък с автомобили и да направите нещо с тях. В нашия първи пример просто ще отпечатаме колите, по една кола на ред. Ето първия ни пример:

println("\nPrinting Cars In Order")
for (index in cars.indices) {
    println(cars[index])
}

Така че това технически не е най-основният for цикъл, вместо това исках да дам пример за това, че можете да направите това в Java (или други езици). По същество това, което правим, е да получим масив от индекси (които са цели числа) с cars.indices и итерираме този списък. Това, което ни позволява, е достъп до масива чрез неговия индекс. Ако исках да имам достъп само до Toyota Camry, просто бих посочил cars[0], което е индексът на тази кола. С масивите те винаги започват от нула и така, ако исках да получа достъп до Toyota Corolla, който е вторият елемент в списъка, бих посочил cars[1]. Нашият цикъл по-горе ще започне от нула и ще завърши на деветнадесет (списъкът ни има двадесет елемента).

Извършване на операции по автомобили

Следващият пример, който искам да дам, е как ще извършваме операции на тези коли. Най-лесният пример, за който се сещам, е да отпечатам имената на автомобилите с малки букви. Правейки това, ние също ще имаме директен достъп до автомобилите, така че няма повече индекс. Като цяло това е начинът, по който вероятно трябва да обикаляте елементи в списък в Kotlin. Ето как изглежда това:

println("\nPrinting Cars In Order (Lowercase)")
for (car in cars) {
    println(car.toLowerCase())
}

Така че по същество това, което правим, е да вземем нашите стойности в cars и да зададем всяка от тях на променлива с име car. След това ще вземем стойността на автомобила, ще я направим с малки букви и след това ще я отпечатаме.

Спрете да печатате, след като „Ford“ бъде отпечатано

Последният пример, през който искам да мина, е използването на цикъл while за отпечатване само на елементи, докато стигнем до такъв, който има „Ford“ в името. Ето как изглежда моето решение:

println("\nPrinting Cars Until Ford Found")
var fordWasPrinted = false
var index = 0;
while (!fordWasPrinted) {
    val car = cars[index]
    println(car)
    fordWasPrinted = car.toLowerCase().contains("ford")
    index++
}

Преди да стигнем до цикъла while, първо настройваме две променливи. Имаме нужда от условие, което да следим за нашия цикъл, за което декларираме fordWasPrinted, което по подразбиране е false. Също така дефинирам index, което ще следи къде се намираме в нашия масив, отново, масивите започват от нула.

Сега е време да влезете в цикъла while, докато fordWasPrinted е невярно, той ще продължи да преминава през цикъла. Първото нещо, което правим вътре в цикъла, е да зададем car равно на текущия ни елемент в масива cars. След това отпечатваме колата на конзолата. На следващия ред определяме дали car съдържа думата "ford". Ние правим това, като първо получаваме представяне на низ с малки букви на кола и след това питаме дали съдържа думата „форд“. Ако го направи, тогава ще върне true, в противен случай ще върне false. Ние присвояваме тази върната стойност на fordWasPrinted. След това увеличаваме стойността на index и се връщаме в началото на нашия цикъл, където проверяваме стойността на fordWasPrinted. След като тази стойност е вярна, ще излезем от цикъла и ще завършим нашата програма.

Като забележка, ако нямате Ford в списъка, моето решение ще доведе до срив на приложението. Като домашна работа не се колебайте да добавите обработка на грешки, така че приложението да не се срине, ако пропуснете Ford от списъка.

Така че сега можете да стартирате програмата и трябва да видите, че списъкът с автомобили се отпечатва три пъти и всеки път трябва да е малко по-различен. Първият път просто ще ги отпечата нормално, вторият път ще бъдат всички с малки букви, а третият път ще отпечата само част от списъка. Ето моето пълно решение:

fun main(args : Array<String>) {

    val cars = arrayOf(
            "Toyota Camry",
            "Toyota Corolla",
            "Honda Civic",
            "Nissan Altima",
            "Honda Accord",
            "Hyundai Elantra",
            "Nissan Sentra",
            "Ford Fusion",
            "Chevrolet Cruze",
            "Hyundai Sonata",
            "Ford Focus",
            "Mazda MX-5 Miata",
            "Fiat 124 Spider",
            "Subaru BRZ",
            "Toyota 86",
            "Nissan Z",
            "Dodge Challenger",
            "Ford Mustang",
            "Chevrolet Camaro",
            "Audi TT / TTS"
    )

    println("\nPrinting Cars In Order")
    for (index in cars.indices) {
        println(cars[index])
    }

    println("\nPrinting Cars In Order (Lowercase)")
    for (car in cars) {
        println(car.toLowerCase())
    }

    println("\nPrinting Cars Until Ford Found")
    var fordWasPrinted = false
    var index = 0;
    while (!fordWasPrinted) {
        val car = cars[index]
        println(car)
        fordWasPrinted = car.toLowerCase().contains("ford")
        index++
    }

}

И това е всичко за този урок. Както винаги, ако имате въпроси или коментари, не се колебайте да оставите отговор по-долу. Темата на тази статия е вдъхновена от отговор в предишната статия, така че правя всичко възможно да включа отзиви в бъдещи статии. Когато сте готови, вижте част 005, където научаваме за функциите.

Също така не забравяйте да ме следвате в Twitter и да препоръчате тази статия, ако ви е харесала.