>  기사  >  Java  >  코드 챌린지 - 전화 서비스 탐색

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

WBOY
WBOY원래의
2024-08-27 20:00:321024검색

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

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

계약된 서비스 확인

성명:

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

금지사항:

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

예상 출력:

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

예:

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는 나에게 무엇을 기대합니까? 루프를 작성하고 각 요소가 내가 찾고 있는 항목과 일치하는지 수동으로 확인한다는 것인가요? 형님, 저는 풀타임으로 일하고 2살 미만의 딸이 있고 아직 Java를 공부하고 있습니다. 그럴 시간 없어, 친구

하지만 Java 8부터 배열을 목록으로 변환하는 것이 가능하며 여기에는 .contains() 메서드가 있다는 것을 발견했습니다. 따라서 이 문제를 해결하려면 부품 배열을 목록으로 변환한 다음 서비스에서 전달된 문자열이 이 목록 내에 있는지 확인하면 됩니다.
존재하는 경우 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부터 Java 8에 존재하는 것과 유사한 더 간단한 방식과 더 기능적인 접근 방식으로 데이터 컬렉션을 작업하는 데 도움이 되는 추상화가 있다는 것을 발견했습니다. 자바스크립트: 스트림.

목록과 마찬가지로 벡터를 스트림으로 변환하고 그 안에 있는 요소가 서비스에 전달된 내용과 일치하는지 확인할 수 있습니다.

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

너무 좋아요.
이 연습은 lambda 구문인 Java에 대해 불평할 또 다른 이유를 제공했습니다. 이중 화살표(=>) 대신 단일 화살표(->)를 사용하는 것이 많이 귀찮습니다.


풀 콤보 채용 확인

성명:

통신사 고객이 통합 서비스 계약을 체결했는지 확인하는 시스템을 구현합니다. 완전한 콤보에는 회사가 제공하는 세 가지 주요 서비스인 이동 전화, 광대역 및 유료 TV가 포함됩니다. 시스템은 고객이 계약한 서비스 목록을 읽고 필요한 모든 서비스가 포함되어 있는지 확인해야 합니다. 세 가지 서비스가 모두 존재하는 경우 시스템은 "Complete Combo"를 반환해야 합니다. 누락된 서비스가 있는 경우 시스템은 "불완전한 콤보"를 반환해야 합니다.

금지사항:

고객이 계약한 서비스를 쉼표로 구분하여 포함하는 문자열입니다. 가능한 값은 모바일, 광대역, TV입니다.

예상 출력:

고객이 모든 서비스 계약을 체결한 경우 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으로 문의하세요.
이전 기사:마지막으로다음 기사:마지막으로