Shanraq.org Shanraq.org
Сөздік пен жиын: белгілерді санау
IT

Rust: алғашқы қадамнан жеке жоспарлау құралына дейін 43-сабақ (барлығы 50)

Сөздік пен жиын: белгілерді санау

43-сабақ. Белгілер бойынша есеп алып, сақтау ретіне тәуелді болмау.

Мәтін ИИ көмегімен аударылды.

Алдын ала: жұптар, итераторлар, collect. Алдыңғы файлды сақтап, src/main.rs файлын осы шағын мысалмен ауыстырыңыз. Дерек әзірше жадта, жоспарлау құралының файлында емес.

Таныс бейне және тірек сызба

Қоймадағы бір дәптер әр санаттағы қорап санын, екіншісі кездескен санаттардың ғана тізімін сақтайды. HashMap<K, V> — «кілт → мән» сөздігі; мұнда белгі → сан. HashSet<T> — қайталанбайтын мәндер жиыны; мұнда белгілер. Бұрышты жақшалар кілт пен мәннің түрлерін көрсетеді; Vec<T> жазылымынан таныс. Хеш — кілттен есептелетін, сақтау орнын таңдауға көмектесетін код; қоймадағы бөлім нөміріне ұқсайды. Әртүрлі кілт бір бөлімге түсуі мүмкін, жинақ мұны өзі реттейді. Ұқсату оқу ретін белгілемейді: HashMap пен HashSet аралау ретіне сенуге болмайды, ол іске қосулар арасында өзгеруі мүмкін.

Белгі → бұрынғы санды оқу → бір қосу → жазу; белгі → жиынға енгізу; көрсету → алдымен реттеу. use std::collections::{HashMap, HashSet} бір модульдегі екі атауды осы файлда қолдануға мүмкіндік береді; :: кейінгі ирек жақшалар сол атауларды тізеді. get(tag) Some(&сан) не None қайтарады; *value сілтеме көрсеткен санды оқиды. insert кілттің бұрынғы мәнін ауыстырады немесе жаңа кілт қосады. Жиынға бір белгіні қайта енгізу оның екінші көшірмесін жасамайды. into_iter().collect() белгілерді Vec<&str> ішіне көшіреді, sort() көрсетуді біріздендіреді. Бұл жолдарды техникалық салыстыру реті, қазақ әліпбиінің сөздік реті емес. counts["жұмыс"] мұнда ғана қауіпсіз: мысал осы кілтті өзі енгізді. Белгісіз кілт болса, бағдарлама қатемен тоқтайды; пайдаланушы енгізген кілтті get пен None арқылы тексеріңіз.

Санап көріңіз

src/main.rs файлын ауыстырып, cargo run пәрменін орындаңыз. HashMap пен HashSet Rust-тың қалыпты кітапханасында бар, қосымша тәуелділік жоқ. Төменде Cargo хабарлары емес, бағдарламаның нәтижесі берілген.

use std::collections::{HashMap, HashSet};

fn main() {
    let tags = ["жұмыс", "үй", "жұмыс"];
    let mut counts: HashMap<&str, usize> = HashMap::new();
    let mut unique: HashSet<&str> = HashSet::new();
    for tag in tags {
        let old = match counts.get(tag) {
            Some(value) => *value,
            None => 0,
        };
        counts.insert(tag, old + 1);
        unique.insert(tag);
    }
    let mut sorted: Vec<&str> = unique.into_iter().collect();
    sorted.sort();
    println!("Белгілер: {:?}", sorted);
    println!("Жұмыс: {}", counts["жұмыс"]);
}
Белгілер: ["жұмыс", "үй"]
Жұмыс: 2

«Жұмыс» екі рет кездескендіктен саны 2, бірақ жиында бір ғана сондай белгі бар. Реттеу тек көрсетілетін тізімге қатысты, санақ өзгермейді. Бұл кейін жоспарлау құралының есебіне жарайды; тапсырмалар әлі іске қосулар арасында сақталмайды.

Бетке қарамай жауап беріңіз

  1. Жиында бір белгінің екі көшірмесі неге жоқ?
  2. counts.get(tag) қайтарған None нені білдіреді?
  3. Көрсетер алдында белгілерді неге реттейміз?

Тапсырма

Міндетті. «Үй» белгісі бар тапсырмалар санын Үй: 1 деп шығарыңыз. HashMap ішіндегі аралау ретіне сүйенбеңіз. Содан соң кіріс жиымына тағы бір «үй» қосып, сан мен жиынның өзгерісін болжаңыз.

Жауаптар

Жауаптарды көрсету

Бұл кілт counts ішіне енгізілген, сондықтан бар жолдан кейін counts["үй"] оқуға болады. Пайдаланушы берген жаңа кілт үшін алдымен get қажет.

Талпыныстан кейінгі үлгі жауап

use std::collections::{HashMap, HashSet};

fn main() {
    let tags = ["жұмыс", "үй", "жұмыс"];
    let mut counts: HashMap<&str, usize> = HashMap::new();
    let mut unique: HashSet<&str> = HashSet::new();
    for tag in tags {
        let old = match counts.get(tag) {
            Some(value) => *value,
            None => 0,
        };
        counts.insert(tag, old + 1);
        unique.insert(tag);
    }
    let mut sorted: Vec<&str> = unique.into_iter().collect();
    sorted.sort();
    println!("Белгілер: {:?}", sorted);
    println!("Жұмыс: {}", counts["жұмыс"]);
    println!("Үй: {}", counts["үй"]);
}
Белгілер: ["жұмыс", "үй"]
Жұмыс: 2
Үй: 1

Тексергеннен кейін

Екінші «үй» енгізілсе, саны 2 болады, ал бірегей белгілер өзгермейді. HashMap туралы ресми тарау · жинақтар шолуы. collect шатастырса, 42-сабаққа оралыңыз.

Алдыңғы сабақ · Мазмұны

Мәтінде қате не теру қатесі кездессе, бізге айтыңыз

Пікірлер (0)

Әзірге пікір жоқ. Бірінші болыңыз.