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.
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.
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)
Jika pelanggan mendapat perkhidmatan yang diterangkan dalam entri pertama, aplikasi mesti memaparkan Ya, jika tidak, ia mesti memaparkan No.
Entrada | Saída |
---|---|
movel Alice,movel,fixa |
Sim |
fixa Bob,movel,tv |
Nao |
tv Carol,movel,fixa,tv |
Sim |
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(); } }
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.
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:
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.
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".
Rentetan yang mengandungi perkhidmatan yang dikontrakkan oleh pelanggan, dipisahkan dengan koma. Nilai yang mungkin adalah mudah alih, jalur lebar dan TV.
Rentetan yang mengandungi Complete Combo jika pelanggan mempunyai semua perkhidmatan dikontrak, Inc Complete Combo sebaliknya.
Entrada | Saída |
---|---|
movel,banda larga,tv | Combo Completo |
movel,tv | Combo Incompleto |
banda larga,tv,movel | Combo Completo |
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(); } }
De novo, esse é um desafio simples. Para chegar no resultado, apenas alguns passos precisam ser seguidos:
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:
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:
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!