코드 챌린지 - 전화 서비스 탐색

WBOY
풀어 주다: 2024-08-27 20:00:32
원래의
937명이 탐색했습니다.

DIO 부트캠프에서 제가 정말 멋지다고 생각하는 점 중 하나는 트레일 중에 근처에 편집자가 있고 몇 가지 조건이 있는 상태에서 몇 가지 코드 연습을 수행해야 한다는 것입니다. 약간 HackerRank 느낌이 나네요. 이론적 부분에서 얻은 지식을 통합하는 데 도움이 되기 때문에 정말 멋지며 프로젝트 챌린지처럼 더 복잡한 접근 방식이 아닙니다. 논리적 추론과 언어 지식을 테스트하기 위한 더 간단한 것입니다. HackerRank와 마찬가지로 미리 만들어진 일부 조각을 제공하고 이를 기반으로 논리를 개발합니다.

이번 주는 정신없었기 때문에 제가 할 수 있었던 유일한 일은 "전화 서비스 탐색" 모듈에서 제안된 두 가지 과제를 해결하는 것뿐이었습니다. 이번 부트캠프의 스폰서가 Claro이기 때문에 많은 테마가 통신적인 느낌을 가질 것입니다.

계약된 서비스 확인

성명:

통신 사업권자는 이동 전화, 유선 전화, 광대역 및 유료 TV의 네 가지 유형의 서비스를 제공합니다. 고객 서비스를 원활하게 하기 위해서는 특정 고객이 특정 서비스를 계약했는지 확인하는 프로그램의 구현이 필요합니다. 예를 들어 고객이 콜센터에 전화해 서비스를 언급하면 상담원은 해당 서비스가 고객과 계약되었는지 빠르게 확인할 수 있어야 합니다.

금지사항:

두 개의 문자열: 하나는 애플리케이션이 확인할 서비스(예: 모바일, 유선, 광대역, TV)입니다. 두 번째는 고객의 이름과 보유 제품을 쉼표로 구분하여 포함해야 합니다(앨리스, 모바일, 고정)

예상 출력:

고객이 첫 번째 항목에 설명된 서비스에 계약한 경우 애플리케이션에 '예'가 표시되어야 합니다. 그렇지 않으면 '아니오'가 표시되어야 합니다.

예:

입구 퇴장
mobile
앨리스,모바일,고정
고정
밥,모바일,tv
아니요
tv
캐롤,모바일,고정,tv

初始代码:

雷雷

解决:

这是一个相对简单的挑战。应用程序收到一个以逗号分隔的字符串,该字符串被转换为一个数组,我们需要找出其中是否有一个字符串与另一个用户输入匹配,这就是我们要检查客户端是否有的服务。简单吧?

对于有 JavaScript 和 C# 历史的我来说,只需使用检查器方法(如 Array.includes() 或 List.Contains())。正确的?错了。

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

在Java中,Array类中没有这样的方法。这可能是因为其实现更接近于低级语言(例如 C)中发生的情况,这规定它们必须是简单且高效的数据结构。显然这种类型的查询不是这个结构的基本功能的一部分。

发现这个信息令人震惊。 Java 期望我做什么?我编写一个for 循环并手动检查是否每个元素都与我要查找的项目匹配?兄弟,我全职工作,我有一个不到两岁的女儿,我还在学习Java。我没有时间做这个,伙计。

但我发现,从 Java 8 开始,可以将数组转换为列表,并且这个列表有 .contains() 方法。因此,要解决这个问题,只需将 parts 数组转换为列表,然后检查服务中传递的字符串是否存在于该列表中。

如果存在,我们打印 Yes,否则,我们打印 No。

雷雷

至此,练习就完成了,但在研究过程中,我发现自 Java 8 以来,出现了一种抽象,可以帮助以更简单的方式和更实用的方法处理数据集合,类似于 JavaScript 中存在的方法:溪流。

就像列表一样,我们可以将向量转换为流,并检查其中存在的任何元素是否与服务中传递的元素相对应:


雷雷

我们可以通过将回调传递给 .anyMatch(p -> p == servico) 方法来完成检查,但这会检查 p 和 servico 是否不仅具有相同的值,而且还指向

相同的内存地址(也就是说,如果它们实际上是同一个对象)。通常,在处理字符串时,即使值相等,此比较也会返回 false,即漏报。因此,使用 servico::equals 进行比较更合适,因为它只比较两个元素之间的,或多或少类似于 JavaScript 的相等比较器 (==)。

有了这个变化,我们就可以判断练习完成了。剩下的就是运行测试并查看它们是否通过:


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

太好了。

这个练习给了我另一个抱怨 Java 的理由,那就是
lambda语法。使用单箭头(->)而不是双箭头(=>)让我很困扰。


完整的组合雇用验证

陈述:

实施一个系统来验证电信公司的客户是否签订了完整的服务组合。完整的组合包括该公司提供的三项主要服务:移动电话、宽带和付费电视。系统必须读取客户签订的服务列表,并确定是否包含所有必要的服务。如果所有三个服务都存在,系统应返回“Complete Combo”。如果缺少任何服务,系统应返回“Incomplete Combo”。

禁止:

包含客户签约服务的字符串,以逗号分隔。可能的值是移动、宽带和电视。

预期输出:

如果客户签订了所有服务合同,则包含 Complete Combo 的字符串,否则包含 Incomplete Combo。

示例:

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!

入场 退出 手机、宽带、电视 完整组合 手机,电视 不完整的组合 宽带、电视、手机 完整组合

위 내용은 코드 챌린지 - 전화 서비스 탐색의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!