Heim > Java > javaLernprogramm > Hauptteil

Code Challenge – Erkundung von Telefoniediensten

WBOY
Freigeben: 2024-08-27 20:00:32
Original
937 Leute haben es durchsucht

Eines der Dinge, die ich an DIO-Bootcamps wirklich cool finde, ist, dass während des Trails einige Codeübungen durchgeführt werden müssen, mit einem Editor in der Nähe und einigen Bedingungen; ein bisschen so eine HackerRank-Atmosphäre. Es ist wirklich cool, weil es hilft, das in den theoretischen Teilen erworbene Wissen zu festigen, und es ist kein komplexerer Ansatz wie die Projektherausforderung: Es ist etwas Vereinfachteres, um Ihr logisches Denken und Ihre Sprachkenntnisse zu testen. Genau wie HackerRank geben sie Ihnen einige vorgefertigte Snippets und Sie entwickeln darauf basierend Ihre Logik.

Diese Woche war verrückt, also habe ich es nur geschafft, die beiden im Modul „Erkundung von Telefondiensten“ vorgeschlagenen Herausforderungen zu lösen. Da der Sponsor dieses Bootcamps Claro ist, werden viele der Themen einen Telekommunikationsbezug haben.

Überprüfung der vertraglich vereinbarten Leistung

Stellungnahme:

Ein Telekommunikationskonzessionär bietet vier Arten von Diensten an: Mobiltelefonie, Festnetztelefonie, Breitband und Pay-TV. Um den Kundenservice zu erleichtern, ist es notwendig, ein Programm zu implementieren, das prüft, ob ein bestimmter Kunde einen bestimmten Service in Anspruch genommen hat. Wenn beispielsweise ein Kunde das Callcenter anruft und eine Dienstleistung erwähnt, muss der Mitarbeiter schnell überprüfen können, ob diese Dienstleistung vom Kunden in Anspruch genommen wird.

Verboten:

Zwei Zeichenfolgen: Eine mit dem Dienst, den die Anwendung überprüft (z. B. Mobil, Festnetz, Breitband, TV). Die zweite muss den Namen des Kunden und die von ihm verwendeten Produkte enthalten, getrennt durch ein Komma (Alice, Mobil, Festnetz)

Erwartete Ausgabe:

Wenn der Kunde die im ersten Eintrag beschriebene Dienstleistung in Anspruch genommen hat, muss im Antrag „Ja“ angezeigt werden, andernfalls muss „Nein“ angezeigt werden.

Beispiele:

Eingang Beenden
Mobil
Alice, mobil, Festnetz
Ja
fest
Bob, Handy, Fernseher
Nein
TV
Carol, Mobil, Festnetz, TV
Ja

Anfangscode:

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();
    }
}
Nach dem Login kopieren
e

Auflösung:

Dies ist eine relativ einfache Herausforderung. Die Anwendung empfängt eine durch Kommas getrennte Zeichenfolge, die in ein Array umgewandelt wird, und wir müssen herausfinden, ob darin eine Zeichenfolge vorhanden ist, die mit einer anderen Benutzereingabe übereinstimmt. Dies ist der Dienst, den wir überprüfen möchten, ob der Client über ihn verfügt. Ganz einfach, oder?

Für mich, der ich Erfahrung mit JavaScript und C# habe, verwende einfach eine Prüfmethode (wie Array.includes() oder List.Contains()). Rechts? Falsch.

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

In Java gibt es in der Array-Klasse keine solche Methode. Dies kann daran liegen, dass die Implementierung viel näher an dem liegt, was in Low-Level-Sprachen (wie C) geschieht, was bedeutet, dass es sich um einfache und effiziente Datenstrukturen handeln muss. Anscheinend gehört diese Art der Abfrage nicht zu den wesentlichen Funktionen dieser Struktur.

Die Entdeckung dieser Informationen war ein Schock. Was erwartet Java von mir? Dass ich eine for-Schleife schreibe und manuell überprüfe, ob jedes Element mit dem gesuchten Element übereinstimmt? Bruder, ich arbeite Vollzeit, habe eine Tochter unter zwei Jahren und lerne immer noch Java. Dafür habe ich keine Zeit, Mann.

Aber ich habe herausgefunden, dass es seit Java 8 möglich ist, das Array in eine Liste umzuwandeln, und diese verfügt über die Methode .contains(). Um dieses Problem zu lösen, konvertieren Sie einfach das Parts-Array in eine Liste und prüfen Sie dann, ob die im Dienst übergebene Zeichenfolge in dieser Liste vorhanden ist.
Wenn es existiert, drucken wir „Ja“ und andernfalls drucken wir „Nein“.

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();
    }
}
Nach dem Login kopieren
e

Damit ist die Übung abgeschlossen, aber während meiner Recherche habe ich entdeckt, dass es seit Java 8 eine Abstraktion gibt, die dabei hilft, einfacher und mit einem funktionaleren Ansatz mit Datensammlungen zu arbeiten, ähnlich wie es in JavaScript existiert: die Bäche.

Genau wie bei Listen können wir den Vektor in einen Stream umwandeln und prüfen, ob eines der darin vorhandenen Elemente mit dem übereinstimmt, was im Dienst übergeben wurde:

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();
    }
}
Nach dem Login kopieren
e

Wir hätten die Prüfung durchführen können, indem wir einen Rückruf an die Methode .anyMatch(p -> p == servico) übergeben, aber diese prüft, ob p und servico nicht nur denselben Wert haben, sondern auch auf die gleiche Speicheradresse verweisen (das heißt, wenn es sich tatsächlich um dasselbe Objekt handelt). Normalerweise gibt dieser Vergleich beim Umgang mit Zeichenfolgen „false“ zurück, selbst wenn der Wert gleich ist, also ein falsches Negativ. Daher ist der Vergleich mit servico::equals angemessener, da er nur die Werte zwischen den beiden Elementen vergleicht, mehr oder weniger wie der Gleichheitskomparator von JavaScript (==).

Mit dieser Änderung können wir beurteilen, dass die Übung abgeschlossen ist. Jetzt müssen Sie nur noch die Tests durchführen und sehen, ob sie bestehen:
Desafio de Código - Explorando Serviços de Telefonia

Zu gut.
Diese Übung gab mir einen weiteren Grund, mich über Java zu beschweren, nämlich die Lambda-Syntax. Die Verwendung des Einzelpfeils (->) anstelle des Doppelpfeils (=>) stört mich sehr.


Vollständige Überprüfung der Kombinationseinstellung

Stellungnahme:

Implementieren Sie ein System, das überprüft, ob ein Kunde eines Telekommunikationsunternehmens eine vollständige Kombination von Diensten abgeschlossen hat. Ein Komplettpaket umfasst die drei Hauptangebote des Unternehmens: Mobilfunk, Breitband und Pay-TV. Das System muss eine Liste der vom Kunden beauftragten Leistungen lesen und feststellen, ob alle notwendigen Leistungen enthalten sind. Wenn alle drei Dienste vorhanden sind, sollte das System „Complete Combo“ zurückgeben. Wenn einer der Dienste fehlt, sollte das System „Unvollständige Kombination“ zurückgeben.

Verboten:

Eine Zeichenfolge, die die vom Kunden vertraglich vereinbarten Dienstleistungen enthält, getrennt durch ein Komma. Mögliche Werte sind Mobil, Breitband und TV.

Erwartete Ausgabe:

Eine Zeichenfolge, die „Komplette Kombination“ enthält, wenn der Kunde alle vertraglich vereinbarten Dienste in Anspruch genommen hat, andernfalls „Unvollständige Kombination“.

Beispiele:

Eingang Beenden
Mobilfunk, Breitband, TV Komplette Combo
Handy, Fernseher Unvollständige Kombination
Breitband, TV, Mobilfunk Komplette 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();
    }
}
Nach dem Login kopieren

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;
}
Nach dem Login kopieren

E preenchemos a condição do nosso if:

if (movelContratado && bandaLargaContratada && tvContratada) {
    return "Combo Completo";
} else {
    return "Combo Incompleto";
Nach dem Login kopieren

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;
    }
}
Nach dem Login kopieren

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();
    }
}
Nach dem Login kopieren

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!

Das obige ist der detaillierte Inhalt vonCode Challenge – Erkundung von Telefoniediensten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!