首頁  >  文章  >  Java  >  程式碼挑戰 - 探索電話服務

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

WBOY
WBOY原創
2024-08-27 20:00:321024瀏覽

我發現 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())。正確的?錯了。

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

在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 相等比較器 (==)。

有了這個變化,我們就可以判斷練習完成了。剩下的就是運行測試並查看它們是否通過:
Desafio de Código - Explorando Serviços de Telefonia

太好了。
這個練習給了我另一個抱怨 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

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:最後下一篇:最後