Rumah> Java> javaTutorial> teks badan

Cabaran Kod - Meneroka Perkhidmatan Telefoni

WBOY
Lepaskan: 2024-08-27 20:00:32
asal
937 orang telah melayarinya

Salah satu perkara yang saya dapati sangat menarik tentang bootcamp 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:

Sebuah syarikat 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 boleh menyemak dengan cepat sama ada perkhidmatan itu dikontrakkan 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:

Masuk Keluar
mudah alih
Alice,mudah alih,dibetulkan
Ya
dibetulkan
Bob, mudah alih, tv
Tidak
tv
Carol,mudah alih,tetap,tv
Ya

Kod awal:

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(); } }
Salin selepas log masuk
e

Resolusi:

Ini adalah cabaran yang agak mudah. Aplikasi menerima rentetan yang dibatasi oleh koma yang diubah menjadi tatasusunan dan kami perlu mengetahui sama ada terdapat rentetan di dalamnya yang sepadan dengan input pengguna lain, iaitu perkhidmatan yang kami ingin 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

Di Jawa, tiada kaedah seperti ini dalam kelas Array. 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 menulisuntuk gelungdan menyemaksecara manualjika setiap elemen sepadan dengan item yang saya cari? Abang bekerja sepenuh masa, ada anak perempuan bawah dua tahun dan masih belajarJawa. Saya tiada 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 kepada senarai, dan kemudian semak sama ada rentetan yang diluluskan dalam perkhidmatan wujud dalam senarai ini.
Jika ada, 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(); } }
Salin selepas log masuk
e

Dengan latihan ini 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 : sungai-sungai.

Sama seperti senarai, kami boleh menukar vektor kepada strim dan menyemak sama ada mana-mana elemen yang terdapat di dalamnya sepadan dengan apa yang 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(); } }
Salin selepas log masuk
e

Kami boleh melakukan semakan dengan menghantar panggilan balik kepada kaedah .anyMatch(p -> p == servico), tetapi ini menyemak sama ada p dan servico bukan sahaja mempunyai nilai yang sama tetapi juga menunjuk kepadaalamat 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 membandingkannilaiantara 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 sintakslambda. Penggunaan anak panah tunggal (->) dan bukannya anak panah berganda (=>) amat mengganggu saya.


Pengesahan Pengambilan Kerja Kombo Penuh

Kenyataan:

Melaksanakan sistem yang mengesahkan 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 hilang, 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 Kombo Lengkap jika pelanggan mempunyai semua perkhidmatan dikontrak, Kombo Tidak Lengkap sebaliknya.

Contoh:

Masuk Keluar
mudah alih, jalur lebar, TV Kombo Lengkap
mudah alih, tv Kombo Tidak Lengkap
jalur lebar, TV, mudah alih Kombo Lengkap

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(); } }
Salin selepas log masuk

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; }
Salin selepas log masuk

E preenchemos a condição do nosso if:

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

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; } }
Salin selepas log masuk

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(); } }
Salin selepas log masuk

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!

sumber:dev.to
Kenyataan Laman Web ini
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
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!