Eines der Dinge, die ich an DIO-Bootcamps wirklich cool finde, ist, dass während des Trails einige Codeübungen durchgeführt werden müssen, mit einem Editor in der Nähe und einigen Bedingungen; ein bisschen so eine HackerRank-Atmosphäre. Es ist wirklich cool, weil es hilft, das in den theoretischen Teilen erworbene Wissen zu festigen, und es ist kein komplexerer Ansatz wie die Projektherausforderung: Es ist etwas Vereinfachteres, um Ihr logisches Denken und Ihre Sprachkenntnisse zu testen. Genau wie HackerRank geben sie Ihnen einige vorgefertigte Snippets und Sie entwickeln darauf basierend Ihre Logik.
Diese Woche war verrückt, also habe ich es nur geschafft, die beiden im Modul „Erkundung von Telefondiensten“ vorgeschlagenen Herausforderungen zu lösen. Da der Sponsor dieses Bootcamps Claro ist, werden viele der Themen einen Telekommunikationsbezug haben.
Ein Telekommunikationskonzessionär bietet vier Arten von Diensten an: Mobiltelefonie, Festnetztelefonie, Breitband und Pay-TV. Um den Kundenservice zu erleichtern, ist es notwendig, ein Programm zu implementieren, das prüft, ob ein bestimmter Kunde einen bestimmten Service in Anspruch genommen hat. Wenn beispielsweise ein Kunde das Callcenter anruft und eine Dienstleistung erwähnt, muss der Mitarbeiter schnell überprüfen können, ob diese Dienstleistung vom Kunden in Anspruch genommen wird.
Zwei Zeichenfolgen: Eine mit dem Dienst, den die Anwendung überprüft (z. B. Mobil, Festnetz, Breitband, TV). Die zweite muss den Namen des Kunden und die von ihm verwendeten Produkte enthalten, getrennt durch ein Komma (Alice, Mobil, Festnetz)
Wenn der Kunde die im ersten Eintrag beschriebene Dienstleistung in Anspruch genommen hat, muss im Antrag „Ja“ angezeigt werden, andernfalls muss „Nein“ angezeigt werden.
Eingang | Beenden |
---|---|
Mobil Alice, mobil, Festnetz |
Ja |
fest Bob, Handy, Fernseher |
Nein |
TV Carol, Mobil, Festnetz, TV |
Ja |
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(); } }
Dies ist eine relativ einfache Herausforderung. Die Anwendung empfängt eine durch Kommas getrennte Zeichenfolge, die in ein Array umgewandelt wird, und wir müssen herausfinden, ob darin eine Zeichenfolge vorhanden ist, die mit einer anderen Benutzereingabe übereinstimmt. Dies ist der Dienst, den wir überprüfen möchten, ob der Client über ihn verfügt. Ganz einfach, oder?
Für mich, der ich Erfahrung mit JavaScript und C# habe, verwende einfach eine Prüfmethode (wie Array.includes() oder List.Contains()). Rechts? Falsch.
In Java gibt es in der Array-Klasse keine solche Methode. Dies kann daran liegen, dass die Implementierung viel näher an dem liegt, was in Low-Level-Sprachen (wie C) geschieht, was bedeutet, dass es sich um einfache und effiziente Datenstrukturen handeln muss. Anscheinend gehört diese Art der Abfrage nicht zu den wesentlichen Funktionen dieser Struktur.
Die Entdeckung dieser Informationen war ein Schock. Was erwartet Java von mir? Dass ich eine for-Schleife schreibe und manuell überprüfe, ob jedes Element mit dem gesuchten Element übereinstimmt? Bruder, ich arbeite Vollzeit, habe eine Tochter unter zwei Jahren und lerne immer noch Java. Dafür habe ich keine Zeit, Mann.
Aber ich habe herausgefunden, dass es seit Java 8 möglich ist, das Array in eine Liste umzuwandeln, und diese verfügt über die Methode .contains(). Um dieses Problem zu lösen, konvertieren Sie einfach das Parts-Array in eine Liste und prüfen Sie dann, ob die im Dienst übergebene Zeichenfolge in dieser Liste vorhanden ist.
Wenn es existiert, drucken wir „Ja“ und andernfalls drucken wir „Nein“.
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(); } }
Damit ist die Übung abgeschlossen, aber während meiner Recherche habe ich entdeckt, dass es seit Java 8 eine Abstraktion gibt, die dabei hilft, einfacher und mit einem funktionaleren Ansatz mit Datensammlungen zu arbeiten, ähnlich wie es in JavaScript existiert: die Bäche.
Genau wie bei Listen können wir den Vektor in einen Stream umwandeln und prüfen, ob eines der darin vorhandenen Elemente mit dem übereinstimmt, was im Dienst übergeben wurde:
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(); } }
Wir hätten die Prüfung durchführen können, indem wir einen Rückruf an die Methode .anyMatch(p -> p == servico) übergeben, aber diese prüft, ob p und servico nicht nur denselben Wert haben, sondern auch auf die gleiche Speicheradresse verweisen (das heißt, wenn es sich tatsächlich um dasselbe Objekt handelt). Normalerweise gibt dieser Vergleich beim Umgang mit Zeichenfolgen „false“ zurück, selbst wenn der Wert gleich ist, also ein falsches Negativ. Daher ist der Vergleich mit servico::equals angemessener, da er nur die Werte zwischen den beiden Elementen vergleicht, mehr oder weniger wie der Gleichheitskomparator von JavaScript (==).
Mit dieser Änderung können wir beurteilen, dass die Übung abgeschlossen ist. Jetzt müssen Sie nur noch die Tests durchführen und sehen, ob sie bestehen:
Zu gut.
Diese Übung gab mir einen weiteren Grund, mich über Java zu beschweren, nämlich die Lambda-Syntax. Die Verwendung des Einzelpfeils (->) anstelle des Doppelpfeils (=>) stört mich sehr.
Implementieren Sie ein System, das überprüft, ob ein Kunde eines Telekommunikationsunternehmens eine vollständige Kombination von Diensten abgeschlossen hat. Ein Komplettpaket umfasst die drei Hauptangebote des Unternehmens: Mobilfunk, Breitband und Pay-TV. Das System muss eine Liste der vom Kunden beauftragten Leistungen lesen und feststellen, ob alle notwendigen Leistungen enthalten sind. Wenn alle drei Dienste vorhanden sind, sollte das System „Complete Combo“ zurückgeben. Wenn einer der Dienste fehlt, sollte das System „Unvollständige Kombination“ zurückgeben.
Eine Zeichenfolge, die die vom Kunden vertraglich vereinbarten Dienstleistungen enthält, getrennt durch ein Komma. Mögliche Werte sind Mobil, Breitband und TV.
Eine Zeichenfolge, die „Komplette Kombination“ enthält, wenn der Kunde alle vertraglich vereinbarten Dienste in Anspruch genommen hat, andernfalls „Unvollständige Kombination“.
Eingang | Beenden |
---|---|
Mobilfunk, Breitband, TV | Komplette Combo |
Handy, Fernseher | Unvollständige Kombination |
Breitband, TV, Mobilfunk | Komplette Combo |
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!
Das obige ist der detaillierte Inhalt vonCode Challenge – Erkundung von Telefoniediensten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!