Melakukan operasi pada daftar

Selesai

Saat menyimpan banyak item dalam daftar, Anda sering melakukan operasi pada bagian atau semua daftar. Modul daftar berisi banyak operasi berguna yang memungkinkan Anda melakukan hal itu.

Mencantumkan fungsi modul

Selain properti, ada modul daftar, yang penuh dengan fungsi yang beroperasi pada daftar. Fungsi ini dapat melakukan operasi yang umum digunakan, seperti menemukan, memfilter, mengurutkan, melakukan operasi matematika, dan banyak lagi.

Perulangan

Untuk melakukan pengulangan berarti melalui setiap elemen dalam daftar, dari titik awal hingga titik akhir. Untuk pengulangan, ada dua fungsi yang sangat menarik:

  • iter(): Fungsi ini memungkinkan Anda melakukan pengulangan di atas setiap item dalam daftar, seperti yang ditunjukkan di sini:

    let cards = [ 1 .. 5 ]
    List.iter(fun i -> printfn "%i" i) cards // 1 2 3 4 5
    

    Fungsi ini iter() mengambil fungsi. Dalam kode sebelumnya, Anda menyediakan fungsi anonim dengan menggunakan kata kunci fun. Fungsi ini mengambil parameter yang mewakili item saat ini saat sedang diulang. Kode berikut setara dengan menulis kode berikut dengan perulangan:

    for i in cards do printfn "%i" i
    
  • map(): Fungsi ini mirip dengan iter(), tetapi memungkinkan Anda mengubah apa yang Anda miliki. Berikut contohnya:

    type Person = { FirstName: string; LastName: string  }
    let people = [
       { FirstName="Albert"; LastName= "Einstein" }
       { FirstName="Marie"; LastName="Curie" }
    ]
    let nobelPrizeWinners = List.map (fun person -> person.FirstName + person.LastName) people 
    printfn "%A" nobelPrizeWinners // ["Albert Einstein"; "Marie Curie"]
    

    Dalam kode sebelumnya, daftar objek Person diubah menjadi daftar string.

Filter

Fungsi filter() juga menggunakan fungsi sebagai parameter, tetapi tujuannya adalah untuk menentukan elemen apa yang harus disimpan. Jika ekspresi mengevaluasi ke true, elemen tersebut disimpan. Jika ekspresinya adalah false, elemen tersebut tidak akan menjadi bagian dari daftar yang difilter. Dalam contoh berikut, daftar difilter untuk menyimpan hanya item yang nilainya dapat dibagi dua:

let cards = [ 1 .. 5 ]
let filteredList = List.filter(fun i-> i % 2 = 0) cards
List.iter(fun i -> printfn "item %i" i) filteredList // item 2 item 4

Daftar filteredList sekarang hanya berisi elemen yang mengembalikan true saat dievaluasi oleh i % 2 = 0, yaitu 2 dan 4.

Sort

Mengurutkan daftar adalah sesuatu yang mungkin sering Anda lakukan. Berikut adalah tiga fungsi yang mungkin berguna saat Mengurutkan daftar:

  • sort(), urutkan dalam urutan naik. Berikut contohnya:

    let list = [2; 1; 5; 3]
    let sortedList = List.sort list // 1 2 3 5 
    
  • sortBy(): Dengan fungsi ini, idenya adalah untuk menunjukkan kunci untuk diurutkan. Katakanlah Anda memiliki daftar orang, dan setiap rekaman memiliki bidang name dan age. Anda kemudian dapat menunjukkan untuk mengurutkan berdasarkan age, misalnya. Fungsi ini mengambil fungsi di mana Anda menunjukkan kunci. Kunci lain bisa berupa panjang string, seperti dalam contoh ini:

    let fruits = ["Banana"; "Apple"; "Pineapple"]
    let sortedFruits = List.sortBy (fun (fruit : string) -> fruit.Length) fruits // Apple, Banana, Pineapple
    
  • sortWith(): Dengan fungsi ini, Anda dapat menyediakan fungsi komparator, karena mungkin tidak terlihat pada awalnya mana dari beberapa item yang harus diurutkan sebelum item lain. Berikut adalah beberapa contoh kode:

    // assume a type like so
    type MagicCreature = { Name : string; Level: int; Attack: int }
    let creatures = [
       { Name="Dragon"; Level=2; Attack=20 }
       { Name="Orc"; Level=1; Attack=5 }
       { Name="Demon"; Level=2; Attack=10 } 
    ]
    
    // comparison function, -1 = less than, 1 = larger than, 0 = equal
    let compareCreatures c1 c2 =
         if c1.Level < c2.Level then -1
         else if c1.Level > c2.Level then 1
         else if c1.Attack < c2.Attack then -1
         else if c1.Attack > c2.Attack then 1
         else 0
    
    let sorted = List.sortWith compareCreatures creatures // { Name="Orc"; Level=1; Attack=5 }, { Name="Demon"; Level=2; Attack=10 }, { Name="Dragon"; Level=2; Attack=20 }
    

    Fungsi perbandingan sebelumnya compareCreatures() pertama-tama mencoba membandingkan dengan Level. Jika tingkatnya sama, tingkat mencoba membandingkan dengan menggunakan Attack. Ini mengembalikan -1 jika sesuatu dianggap lebih kecil, 1 jika lebih besar, dan 0 jika sama.

Hal lain yang mungkin ingin Anda lakukan adalah menemukan elemen tertentu. Untuk melakukannya, Anda dapat memilih dari fungsi berikut:

  • find(): Fungsi ini menemukan elemen pertama yang cocok dengan kondisi tertentu. Untuk menggunakan find(), Anda perlu menyediakan fungsi (predikat) yang mengekspresikan cara menemukan item. Berikut contohnya:

    let list = [1; 2; 3; 4]
    let found = List.find( fun x -> x % 2 = 0) list // 2 - Only the first element that matches the condition is returned.
    
  • tryFind(). Fungsi ini mengambil fungsi (predikat) yang memberi tahu cara menemukan nilai dan daftar untuk dilihat. Ini mengembalikan opsi. Inilah cara Anda dapat menggunakannya:

    let findValue aValue aList =
         let found = aList |> List.tryFind(fun item -> item = aValue)
    
         match found with
         | Some value -> printfn "%i" value
         | None -> printfn "Not found"
    
    findValue 1 list // 1
    findValue 5 list // Not found
    

    Dalam kode sebelumnya, Anda mengirim nilai untuk dibandingkan dengan daftar Anda. Jika ditemukan, ia akan mengembalikan Some. Jika tidak ditemukan, ia akan mengembalikan None.

  • tryFindIndex(). Seperti tryFind(), fungsi ini mengembalikan opsi, dan dibutuhkan fungsi (predikat) yang mengevaluasi ke Boolean. Berikut tampilan kodenya:

    let found = List.tryFindIndex(fun x -> x = 4) list
    match found with
       | Some index -> printfn "%i" index
       | None -> printfn "Not found"
    

Operasi aritmatika

Melakukan operasi matematika dalam daftar bisa sangat berharga. Di antara banyak fungsi yang dapat dipilih di List API, berikut adalah tiga fungsi yang paling berguna:

  • sum(): Dengan menggunakan fungsi ini, Anda melakukan pengulangan pada setiap item untuk menjumlahkan semua nilai dalam daftar. Inilah cara Anda dapat menggunakannya:

    let sum = List.sum [1 .. 5] // sum = 15 
    
  • sumBy(): Dengan fungsi ini, idenya adalah untuk menunjukkan cara menjumlahkan nilai. Salah satu cara untuk melakukannya adalah dengan menunjukkan bidang mana yang akan dijumlahkan, seperti dalam contoh berikut:

    type OrderItem = { Name: string; Cost:int }
    
    let orderItems = [
           { Name="XBox"; Cost=500 }
           { Name="Book"; Cost=10 }
           { Name="Movie ticket"; Cost=7 }
         ]
    
    let sum = List.sumBy(fun item -> item.Cost) orderItems
    printfn "%i" sum // 517
    

    Dalam kode sebelumnya, bidang Cost ditunjukkan, dan setiap item di bidang itu ditambahkan ke total.

  • average(): Fungsi ini mirip sum() dengan di dalamnya beroperasi pada daftar angka, tetapi dengan dua perbedaan:

    • Ini mengharapkan data menjadi angka titik mengambang, bukan bilangan bulat.
    • Ini menghitung rata-rata daripada jumlah.

    Berikut contohnya:

    let numbers = [ 1.0; 2.5; 3.0 ]
    let avg = List.average numbers
    printfn "%f" avg // 2.166667
    
  • averageBy(): Seperti sumBy(), averageBy() mengambil fungsi di mana Anda menentukan nilai apa yang Anda inginkan. Berikut contohnya:

    type WeatherMeasurement = { Date: string; Temperature: float }
    let measurements = [
        { Date="07/20/2021"; Temperature=21.3 }
        { Date="07/21/2021"; Temperature=23.2 }
        { Date="07/22/2021"; Temperature=20.7 }
    ]
    
    let avgBy = List.averageBy(fun m -> m.Temperature) measurements
    printfn "%f" avgBy // 21.733333