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(); } }
C'est un défi relativement simple. L'application reçoit une chaîne délimitée par des virgules qui est transformée en tableau et nous devons savoir s'il contient une chaîne qui correspond à une autre entrée utilisateur, qui est le service dont nous voulons vérifier si le client dispose. Facile, non ?
Pour moi, qui a un historique de JavaScript et de C#, utilisez simplement une méthode de vérification (comme Array.includes() ou List.Contains()). Droite? Faux.
En Java, il n'existe pas de méthode comme celle-ci dans la classe Array. Cela peut être dû au fait que l'implémentation est beaucoup plus proche de ce qui se passe dans les langages de bas niveau (tels que C), ce qui établit qu'il doit s'agir de structures de données simples et efficaces. Apparemment ce type de requête ne fait pas partie des fonctions essentielles de cette structure.
Découvrir cette information a été un choc. Qu’est-ce que Java attend de moi ? Que j'écris uneboucle foret vérifiemanuellementsi chaque élément correspond à l'élément que je recherche ? Frère, je travaille à temps plein, j'ai une fille de moins de deux ans et j'étudie toujoursJava. Je n'ai pas le temps pour ça, mec.
Mais j'ai découvert que depuis Java 8 il est possible de convertir le tableau en liste et celle-ci possède la méthode .contains(). Donc, pour résoudre ce problème, convertissez simplement le tableau de pièces en liste, puis vérifiez si la chaîne transmise dans le service existe dans cette liste.
S'il existe, on imprime Oui et sinon, on imprime Non.
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(); } }
Avec cela l'exercice est terminé, mais au cours des recherches que j'ai faites j'ai découvert que depuis Java 8 il existe une abstraction qui permet de travailler avec des collections de données de manière plus simple et avec une approche plus fonctionnelle, similaire à ce qui existe en JavaScript : les ruisseaux.
Tout comme avec les listes, nous pouvons convertir le vecteur en flux et vérifier si l'un des éléments présents correspond à ce qui a été transmis dans le service :
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(); } }
Nous aurions pu effectuer la vérification en passant un rappel à la méthode .anyMatch(p -> p == servico), mais cela vérifie si p et servico ont non seulement la même valeur mais pointent également versla même adresse mémoire(c'est-à-dire s'il s'agit en fait du même objet). Normalement, lorsqu'il s'agit de chaînes, cette comparaison renvoie false même si la valeur est égale, c'est-à-dire un faux négatif. Par conséquent, la comparaison utilisant servico::equals est plus appropriée, car elle compare uniquement lesvaleursentre les deux éléments, plus ou moins comme le comparateur d'égalité de JavaScript (==).
Avec ce changement, on peut juger que l'exercice est terminé. Il ne reste plus qu'à lancer les tests et voir s'ils réussissent :
Trop bien.
Cet exercice m'a donné une autre raison de me plaindre de Java, qui est la syntaxelambda. L'utilisation de la flèche simple (->) au lieu de la flèche double (=>) me dérange beaucoup.
Mettre en place un système qui vérifie si un client d'une entreprise de télécommunications a souscrit à une combinaison complète de services. Un combo complet comprend les trois principaux services proposés par l'entreprise : téléphonie mobile, haut débit et télévision payante. Le système doit lire une liste de services contractés par le client et déterminer si tous les services nécessaires sont inclus. Si les trois services sont présents, le système doit renvoyer « Complete Combo ». Si l'un des services est manquant, le système devrait renvoyer "Combo incomplet".
Une chaîne contenant les services souscrits par le client, séparés par une virgule. Les valeurs possibles sont le mobile, le haut débit et la télévision.
Une chaîne contenant Complete Combo si le client dispose de tous les services souscrits, Incomplete Combo sinon.
Entrée | Sortie |
---|---|
mobile, haut débit, TV | Combo complet |
mobile,télévision | Combo incomplet |
haut débit, TV, mobile | Combo complet |
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!
以上がコード チャレンジ - テレフォニー サービスの探索の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。