首頁> Java> java教程> 主體

程式碼挑戰 - 探索電話服務

WBOY
發布: 2024-08-27 20:00:32
原創
937 人瀏覽過

我發現 DIO 訓練營非常酷的一件事是,在訓練期間需要進行一些程式碼練習,附近有一個編輯器並有一些條件;有點像 HackerRank 的氛圍。這真的很酷,因為它有助於鞏固在理論部分中獲得的知識,而且它不是像專案挑戰那樣更複雜的方法:它是更簡單的東西,可以測試您的邏輯推理和語言知識。就像 HackerRank 一樣,他們給你一些現成的片段,你可以根據這些片段來發展你的邏輯。

這週很瘋狂,所以我唯一能做的就是解決「探索電話服務」模組中提出的兩個挑戰。由於本次訓練營的贊助商是Claro,所以很多主題都會帶有電信的味道。

簽約服務驗證

陳述:

電信特許經營商提供四種類型的服務:行動電話、固定電話、寬頻和付費電視。為了方便客戶服務,有必要實施一個程序來檢查特定客戶是否簽訂了某種服務合約。例如,當客戶致電呼叫中心並提及某項服務時,服務員必須能夠快速檢查該服務是否由客戶簽署。

禁止:

兩個字串:一個包含應用程式將檢查的服務(例如,移動、固定、寬頻、電視)。第二個必須包含客戶的姓名以及他們擁有的產品,以逗號分隔(Alice、移動、固定)

預期輸出:

如果客戶簽訂了第一個條目中所述的服務,則應用程式必須顯示“是”,否則必須顯示“否”。

範例:

入場 退出
移動
Alice,移動,固定
是的
固定
鮑勃,移動,電視
沒有
電視
卡羅爾,移動,固定,電視
是的

初始代碼:

雷雷

解決:

這是一個相對簡單的挑戰。應用程式收到一個以逗號分隔的字串,該字串被轉換為一個數組,我們需要找出其中是否有一個字串與另一個使用者輸入匹配,這就是我們要檢查客戶端是否有的服務。簡單吧?

對於有 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學習者快速成長!