我發現 DIO 訓練營非常酷的一件事是,在訓練期間需要進行一些程式碼練習,附近有一個編輯器並滿足一些條件;有點像 HackerRank 的氛圍。這真的很酷,因為它有助於鞏固在理論部分中獲得的知識,而且它不是像專案挑戰那樣更複雜的方法:它是更簡單的東西,可以測試您的邏輯推理和語言知識。就像 HackerRank 一樣,他們給你一些現成的片段,你可以根據這些片段來發展你的邏輯。
這週太瘋狂了,所以我唯一能做的就是解決「探索電話服務」模組中提出的兩個挑戰。由於本次訓練營的贊助商是Claro,所以很多主題都會帶有電信的味道。
電信特許經營商提供四種類型的服務:行動電話、固定電話、寬頻和付費電視。為了方便客戶服務,有必要實施一個程序來檢查特定客戶是否簽訂了某種服務合約。例如,當客戶致電呼叫中心並提及某項服務時,服務員必須能夠快速檢查該服務是否是客戶簽署的。
兩個字串:一個包含應用程式將檢查的服務(例如,移動、固定、寬頻、電視)。第二個必須包含客戶的姓名以及他們擁有的產品,以逗號分隔(Alice、移動、固定)
如果客戶簽訂了第一個條目中所述的服務,則應用程式必須顯示“是”,否則必須顯示“否”。
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(); } }
這是一個相對簡單的挑戰。應用程式收到一個以逗號分隔的字串,該字串被轉換為一個數組,我們需要找出其中是否有一個字串與另一個使用者輸入匹配,這就是我們要檢查客戶端是否有的服務。簡單吧?
對於有 JavaScript 和 C# 歷史的我來說,只需使用檢查器方法(如 Array.includes() 或 List.Contains())。正確的?錯了。
在Java中,Array類別中沒有這樣的方法。這可能是因為其實作更接近低階語言(例如 C)中發生的情況,這規定它們必須是簡單且高效的資料結構。顯然這種類型的查詢不是這個結構的基本功能的一部分。
發現這個訊息令人震驚。 Java 期望我做什麼?我寫一個循環並檢查手動每個元素是否與我正在尋找的項目相符?兄弟,我全職工作,我有一個不到兩歲的女兒,我還在學習Java。我沒時間做這個,夥計。
但我發現,從 Java 8 開始,可以將數組轉換為列表,並且這個列表具有 .contains() 方法。因此,要解決這個問題,只需將 parts 數組轉換為列表,然後檢查服務中傳遞的字串是否存在於該列表中即可。
如果存在,我們列印 Yes,否則,我們列印 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(); } }
至此,練習就完成了,但在我所做的研究過程中,我發現自Java 8 以來,有一種抽像有助於以更簡單的方式和更實用的方法處理資料集合,類似於中存在的內容JavaScript:流。
就像列表一樣,我們可以將向量轉換為流,並檢查其中存在的任何元素是否與服務中傳遞的元素相對應:
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(); } }
我們可以檢查 p 和 servico 是否不僅具有相同的值,而且還指向相同的記憶體位址(也就是說,如果它們實際上是同一個物件)。通常,在處理字串時,即使值相等,此比較也會傳回 false,即漏報。因此,使用 servico::equals 進行比較更合適,因為它只比較兩個元素之間的 值,或多或少類似於 JavaScript 相等比較器 (==)。
有了這個變化,我們就可以判斷練習完成了。剩下的就是運行測試並查看它們是否通過:
太好了。
這個練習給了我另一個抱怨 Java 的理由,那就是 lambda 文法。使用單箭頭 (->) 而不是雙箭頭 (=>) 讓我很困擾。
實施一個系統來檢查電信公司的客戶是否簽訂了完整的服務組合。完整的組合包括該公司提供的三項主要服務:行動電話、寬頻和付費電視。系統必須讀取客戶簽署的服務列表,並確定是否包含所有必要的服務。如果所有三個服務都存在,系統應傳回「Complete Combo」。如果缺少任何服務,系統應傳回「Incomplete Combo」。
包含客戶簽章服務的字串,以逗號分隔。可能的值是行動、寬頻和電視。
如果客戶已簽署所有服務,則包含完整組合的字串,否則包含不完整組合。
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!
以上是程式碼挑戰 - 探索電話服務的詳細內容。更多資訊請關注PHP中文網其他相關文章!