Rumah  >  Artikel  >  Java  >  Cabaran Kod - Meneroka Perkhidmatan Telefoni

Cabaran Kod - Meneroka Perkhidmatan Telefoni

WBOY
WBOYasal
2024-08-27 20:00:321084semak imbas

Salah satu perkara yang saya dapati sangat menarik tentang kem but DIO ialah semasa jejak terdapat beberapa latihan kod yang perlu dijalankan, dengan editor berdekatan dan beberapa syarat; sedikit getaran HackerRank seperti itu. Ia benar-benar hebat kerana ia membantu untuk menyatukan pengetahuan yang diperoleh semasa bahagian teori dan ia bukan pendekatan yang lebih kompleks seperti cabaran projek: ia sesuatu yang lebih mudah, untuk menguji penaakulan logik anda dan pengetahuan bahasa anda. Sama seperti HackerRank, mereka memberi anda beberapa coretan siap dan anda membangunkan logik anda berdasarkan itu.

Minggu ini sangat gila, jadi satu-satunya perkara yang saya berjaya lakukan ialah menyelesaikan dua cabaran yang dicadangkan dalam modul "Meneroka Perkhidmatan Telefoni". Memandangkan penaja bootcamp ini ialah Claro, banyak tema akan mempunyai citarasa telekom.

Pengesahan Perkhidmatan Berkontrak

Kenyataan:

Pemilik konsesi telekomunikasi menawarkan empat jenis perkhidmatan: telefon mudah alih, telefon tetap, jalur lebar dan TV berbayar. Untuk memudahkan perkhidmatan pelanggan, adalah perlu untuk melaksanakan program yang menyemak sama ada pelanggan tertentu telah mengontrak perkhidmatan tertentu. Contohnya, apabila pelanggan menghubungi pusat panggilan dan menyebut perkhidmatan, atendan mesti dapat menyemak dengan cepat sama ada perkhidmatan itu dikontrak oleh pelanggan.

dilarang:

Dua rentetan: Satu dengan perkhidmatan yang akan disemak oleh aplikasi (contohnya, mudah alih, tetap, jalur lebar, TV). Yang kedua mesti mengandungi nama pelanggan dan produk yang mereka miliki, dipisahkan dengan koma (Alice, mudah alih, tetap)

Output yang dijangkakan:

Jika pelanggan mendapat perkhidmatan yang diterangkan dalam entri pertama, aplikasi mesti memaparkan Ya, jika tidak, ia mesti memaparkan No.

Contoh:

Entrada Saída
movel
Alice,movel,fixa
Sim
fixa
Bob,movel,tv
Nao
tv
Carol,movel,fixa,tv
Sim

Kod mula:

import java.util.Scanner;

public class VerificacaoServico {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // Entrada do serviço a ser verificado
        String servico = scanner.nextLine().trim();

        // Entrada do nome do cliente e os serviços contratados
        String entradaCliente = scanner.nextLine().trim();

        // Separando o nome do cliente e os serviços contratados
        String[] partes = entradaCliente.split(",");
        String nomeCliente = partes[0];
        boolean contratado = false;

        // TODO: Verifique se o serviço está na lista de serviços contratados

        scanner.close();
    }
}

Resolusi:

Ini adalah cabaran yang agak mudah. Aplikasi ini menerima rentetan yang dibatasi oleh koma yang diubah menjadi tatasusunan dan kita perlu mengetahui sama ada terdapat rentetan di dalamnya yang sepadan dengan input pengguna lain, iaitu perkhidmatan yang ingin kita semak sama ada pelanggan mempunyai. Mudah kan?

Bagi saya, yang mempunyai sejarah JavaScript dan C#, hanya gunakan kaedah pemeriksa (seperti Array.includes() atau List.Contains()). Betul ke? Salah.

Desafio de Código - Explorando Serviços de Telefonia

Tiada kaedah seperti ini dalam kelas Array di Jawa. Ini mungkin disebabkan oleh pelaksanaan yang lebih hampir dengan apa yang berlaku dalam bahasa peringkat rendah (seperti C), yang menetapkan bahawa ia mestilah struktur data yang mudah dan cekap. Nampaknya jenis pertanyaan ini bukan sebahagian daripada fungsi penting struktur ini.

Menemui maklumat ini adalah satu kejutan. Apakah yang Java harapkan saya lakukan? Bahawa saya menulis gelung dan menyemak secara manual jika setiap elemen sepadan dengan item yang saya cari? Abang, saya bekerja sepenuh masa, saya ada anak perempuan bawah dua tahun dan saya masih belajar Jawa. Saya tidak mempunyai masa untuk itu, kawan.

Tetapi saya mendapati bahawa sejak Java 8 adalah mungkin untuk menukar tatasusunan kepada senarai dan yang ini mempunyai kaedah .contains(). Jadi, untuk menyelesaikan masalah ini, cuma tukar tatasusunan bahagian menjadi senarai, kemudian semak sama ada rentetan yang diluluskan dalam perkhidmatan wujud dalam senarai ini.
Jika wujud, kami cetak Ya dan sebaliknya, kami cetak No.

import java.util.Arrays;
import java.util.Scanner;

public class VerificacaoServico {
    public static void main(String[] args) {
        //...
        // TODO: Verifique se o serviço está na lista de serviços contratados
        contratado = Arrays.asList(partes).contains(servico);

        System.out.println(contratado ? "Sim" : "Nao");

        scanner.close();
    }
}

Dengan ini latihan selesai, tetapi semasa penyelidikan yang saya lakukan, saya mendapati bahawa sejak Java 8 terdapat abstraksi yang membantu untuk bekerja dengan koleksi data dengan cara yang lebih mudah dan dengan pendekatan yang lebih berfungsi, sama seperti yang wujud dalam JavaScript: strim.

Sama seperti senarai, kami boleh menukar vektor kepada strim dan menyemak sama ada mana-mana elemen yang terdapat di dalamnya sepadan dengan apa yang telah diluluskan dalam perkhidmatan:

import java.util.Arrays;
import java.util.Scanner;

public class VerificacaoServico {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // Entrada do serviço a ser verificado
        String servico = scanner.nextLine().trim();

        // Entrada do nome do cliente e os serviços contratados
        String entradaCliente = scanner.nextLine().trim();

        // Separando o nome do cliente e os serviços contratados
        String[] partes = entradaCliente.split(",");
        String nomeCliente = partes[0];
        boolean contratado = false;

        contratado = Arrays.stream(partes).anyMatch(servico::equals);

        System.out.println(contratado ? "Sim" : "Nao");

        scanner.close();
    }
}

Kami boleh menyemak sama ada p dan servico bukan sahaja mempunyai nilai yang sama tetapi juga menunjuk kepada alamat memori yang sama (iaitu, jika mereka sebenarnya objek yang sama). Biasanya, apabila berurusan dengan rentetan, perbandingan ini akan mengembalikan palsu walaupun nilainya sama -- iaitu negatif palsu. Oleh itu, perbandingan menggunakan servico::equals adalah lebih sesuai, kerana ia hanya membandingkan nilai antara dua elemen, lebih kurang seperti pembanding kesamaan JavaScript (==).

Dengan perubahan ini, kita boleh menilai bahawa latihan itu selesai. Apa yang tinggal ialah menjalankan ujian dan lihat sama ada mereka lulus:
Desafio de Código - Explorando Serviços de Telefonia

Terlalu bagus.
Latihan ini memberi saya satu lagi sebab untuk mengadu tentang Java, iaitu sintaks lambda. Penggunaan anak panah tunggal (->) dan bukannya anak panah berganda (=>) sangat mengganggu saya.


Pengesahan Pengambilan Kerja Kombo Penuh

Kenyataan:

Melaksanakan sistem yang menyemak sama ada pelanggan syarikat telekomunikasi telah mendapat kombo perkhidmatan yang lengkap. Kombo lengkap termasuk tiga perkhidmatan utama yang ditawarkan oleh syarikat: telefon mudah alih, jalur lebar dan TV berbayar. Sistem mesti membaca senarai perkhidmatan yang dikontrakkan oleh pelanggan dan menentukan sama ada semua perkhidmatan yang diperlukan disertakan. Jika ketiga-tiga perkhidmatan ada, sistem harus mengembalikan "Kombo Lengkap". Jika mana-mana perkhidmatan yang tiada, sistem harus mengembalikan "Kombo Tidak Lengkap".

dilarang:

Rentetan yang mengandungi perkhidmatan yang dikontrakkan oleh pelanggan, dipisahkan dengan koma. Nilai yang mungkin adalah mudah alih, jalur lebar dan TV.

Output yang dijangkakan:

Rentetan yang mengandungi Complete Combo jika pelanggan mempunyai semua perkhidmatan dikontrak, Inc Complete Combo sebaliknya.

Contoh:

Entrada Saída
movel,banda larga,tv Combo Completo
movel,tv Combo Incompleto
banda larga,tv,movel Combo Completo

Código inicial:

import java.util.Scanner;

public class VerificacaoComboCompleto {

    // Função para verificar se o cliente contratou um combo completo
    public static String verificarComboCompleto(String[] servicosContratados) {
        // Variáveis booleanas para verificar a contratação de cada serviço
        boolean movelContratado = false;
        boolean bandaLargaContratada = false;
        boolean tvContratada = false;

        // TODO: Itere sobre os serviços contratados
        for (String servico : servicosContratados) {
        }

        // TODO: Verifique se todos os serviços foram contratados
        if () {
            return "Combo Completo";
        } else {
            return "Combo Incompleto";
        }
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // Solicitando ao usuário a lista de serviços contratados
        String input = scanner.nextLine();

        // Convertendo a entrada em uma lista de strings
        String[] servicosContratados = input.split(",");

        // Verificando se o cliente contratou um combo completo
        String resultado = verificarComboCompleto(servicosContratados);

        // Exibindo o resultado
        System.out.println(resultado);

        // Fechando o scanner
        scanner.close();
    }
}

Resolução:

De novo, esse é um desafio simples. Para chegar no resultado, apenas alguns passos precisam ser seguidos:

  1. Iterar sobre a array gerada pelo método main a partir da string inserida pelo usuário;
  2. Checar se os serviços disponibilizados (descritos nas variáveis booleanas logo acima) foram contratados;
    • Em caso positivo, a variável correspondente deve ter seu valor alterado para true.
  3. Verificar se todos os serviços estão com o valor true. Apesar de ter mais passos, é bem mais direto que o anterior. Podemos começar a resolver esse trem de um jeito bem tosco, com uma série de ifs encadeados:
for (String servico : servicosContratados) {
    if(servico.equals("movel")) movelContratado = true;
    if(servico.equals("bandaLarga")) bandaLargaContratada = true;
    if(servico.equals("tv")) tvContratada = true;
}

E preenchemos a condição do nosso if:

if (movelContratado && bandaLargaContratada && tvContratada) {
    return "Combo Completo";
} else {
    return "Combo Incompleto";

Assim como no primeiro, com essas adições o desafio pode ser considerado como completo, mas esses ifs, um seguido do outro me incomoda um pouco. Podemos alterar isso pra um switch pra ficar menos feio:

for (String servico : servicosContratados) {
    switch (servico) {
        case "movel":
            movelContratado = true;
            break;
        case "banda larga":
            bandaLargaContratada = true;
            break;
        case "tv":
            tvContratada = true;
            break;
        default:
            System.out.println("Serviço inválido.");
            break;
    }
}

Há quem diga que os ifs são de mais fácil leitura e que o ganho que a otimização traria para um switch tão pequeno como esse é desprezível. Outros diriam que eu tenho pouca consistência interna, reclamando de checar manualmente strings em um exercício e fazendo sem um pio em outro.
Pra essas pessoas eu digo:
Desafio de Código - Explorando Serviços de Telefonia

O código final ficaria então:

import java.util.Scanner;
public class VerificacaoComboCompleto {
    // Função para verificar se o cliente contratou um combo completo
    public static String verificarComboCompleto(String[] servicosContratados) {
        // Variáveis booleanas para verificar a contratação de cada serviço
        boolean movelContratado = false;
        boolean bandaLargaContratada = false;
        boolean tvContratada = false;

        for (String servico : servicosContratados) {
            switch (servico) {
                case "movel":
                    movelContratado = true;
                    break;
                case "banda larga":
                    bandaLargaContratada = true;
                    break;
                case "tv":
                    tvContratada = true;
                    break;
                default:
                    System.out.println("Serviço inválido.");
                    break;
            }
        }

        if (movelContratado && bandaLargaContratada && tvContratada) {
            return "Combo Completo";
        } else {  
            return "Combo Incompleto";
        }
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        // Solicitando ao usuário a lista de serviços contratados
        String input = scanner.nextLine();
        // Convertendo a entrada em uma lista de strings
        String[] servicosContratados = input.split(",");
        // Verificando se o cliente contratou um combo completo
        String resultado = verificarComboCompleto(servicosContratados);
        // Exibindo o resultado
        System.out.println(resultado);
        // Fechando o scanner
        scanner.close();
    }
}

Que, ao rodar a suite de testes, nos mostra que deu tudo certo:
Desafio de Código - Explorando Serviços de Telefonia
O código desses (e dos demais) desafios está aqui.
Então é isso, pessoal. Até a próxima!

Atas ialah kandungan terperinci Cabaran Kod - Meneroka Perkhidmatan Telefoni. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:AkhirnyaArtikel seterusnya:Akhirnya