Je l'ai résolu avec Java! !! Exercice Paiza "Long Table Unagiya" ~ Orienté objet ~

introduction

Cet article est écrit par des débutants en programmation. Quel est le problème, vous devriez le faire plus! !! Si vous avez des questions, Commentez s'il vous plaît.

Cette question est aussi un exercice de paiza. Soyez assuré qu'il n'y a rien à voir avec l'augmentation ou la diminution du rang.

スクリーンショット 2018-10-29 22.17.03.png

Un gars non orienté objet

J'ai essayé de le résoudre avec Java! !! Exercice Paiza "Long Table Unagiya"

C'est un type procédural (est-ce correct?). Lorsque j'ai publié cet article, j'avais du code écrit orienté objet, donc Je l'ai digéré à ma manière.

Veuillez vérifier ici pour les détails spécifiques du problème.

Pensez orienté objet

Code écrit de manière non orientée objet

import java.util.*;

public class unagiya {

    public static void main(String[] args) {
        /*
         *Obtenez le nombre total de sièges dans le magasin et le nombre de groupes visitant le magasin sous forme de chaîne et enregistrez-le dans la ligne
         *Les données stockées en ligne sont divisées par division et stockées dans lineArray du tableau String.
         */
        Scanner scanner = new Scanner(System.in);
        String line = scanner.nextLine();
        String[] lineArray = line.split(" ");
        /*
         *Cast les données stockées dans lineArray et les stocker dans chaque variable
         * 
         * seatNum:nombre de places
         * totalGuest:Nombre de groupes visitant le magasin
        */
        int seatNum = castString(lineArray[0]);
        int totalGuest = castString(lineArray[1]);

        /*
         * seats:Créer le nombre de sièges avec hashMap
         *Integer est le numéro de siège
         *Que Boolean soit une personne ou non(Si c'est vrai, vous pouvez vous asseoir,)
         */
        Map<Integer,Boolean> seats = new HashMap<>();
        for(int i = 1; i <= seatNum; i++){
            seats.put(i,true);
        }
        /*
         *isSitCustomer:Vérifiez s'il y a des personnes dans le siège choisi par le client
         *Sinon, lancez vrai
         *
         * choiceSeat:Numéro de siège qui est le point de base que les clients doivent choisir
         *menberNum:Nombre de clients venus
         */

        int choiceSeat = 0;
        int memberNum = 0;

        for(int i = 0; i < totalGuest; i++){
            //Reçoit la valeur d'entrée de la console
            //Attribuer à memberNum et choiceSeat
            line = scanner.nextLine();
            lineArray = line.split(" ");

            memberNum = castString(lineArray[0]);
            choiceSeat = castString(lineArray[1]);

            //Si isSitGuest est vrai, réécrivez les informations de siège du siège sélectionné par le client et le nombre de personnes sur false
            if(isSitGuest(seats,choiceSeat,memberNum)){
                for(int j = 0,index = 1 ; j < memberNum; j++){
                    if(seats.size() < choiceSeat + j){
                        seats.put(index, false);
                        index++;
                    } else {
                        seats.put(choiceSeat + j,false);
                    }
                }
            }
        }

        //Vérifiez le faux nombre d'informations sur le siège et remplacez-le dans le résultat
        int result = 0;

        for(int i = 1; i <= seats.size(); i++){
            if(seats.get(i).equals(false)){
                result++;
            }
        }
        System.out.println(result);
    }

    //Convertir un nombre de type String en type int
    public static int castString(String strNum){
        int num = Integer.parseInt(strNum);
        return num;
    }

    /*
     *Plan Recevoir les informations sur les sièges, les sièges sélectionnés par les clients, le nombre de clients,
     *Vérifier s'il y a faux pour le nombre de clients du siège sélectionné par le client
     * 
     *conditions
     *Renvoie false s'il y a plus d'invités que de sièges
     *Renvoie false s'il y a même un faux dans les informations de siège
     */
    public static boolean isSitGuest(Map seats, int choiceSeat, int menberNum){
        if(menberNum > seats.size()){
            return false;    
        }

        boolean flag = true;

        for(int i = 0,index = 1; i < menberNum; i++){

            //index:Spécifiez le tout premier 1 des informations sur le siège
            //Utilisé lors du comptage à partir de 1 lorsque le nombre de clients dépasse le numéro de siège

            if(seats.size() < choiceSeat + i){
                if(seats.get(index).equals(false)){
                    flag = false;
                    index++;
                } else {
                    index++;
                }
            } else if(seats.get(choiceSeat + i).equals(false)){
                flag = false;
            }

            }
        if(flag){
            return true;
        } else {
            return false;
        }
    }
}

Mais qui a écrit ce code ...

Je l'ai relu après environ deux semaines, mais c'est difficile à voir. Je crée des sièges avec Map et fais diverses choses ... (J'ai arrêté de lire au milieu)

À ce moment-là, j'étais de bonne humeur, disant: «J'ai pu écrire un code décent».

Cependant, un mot de shiracamus qui est apparu comme un météore "Parce que c'est un gros problème, soyons orientés objet."

Voici le code que j'ai laissé avec ce mot (Nous avons la permission de shiracamus pour publier le code)

@ Code de Shiracamus

import java.util.*;

enum Seat { AVAILABLE, TAKEN };

class LongTable {
    private Seat seat[];

    LongTable(int seatNum) {
        seat = new Seat[seatNum];
        for (int i = 0; i < seatNum; i++) {
            seat[i] = Seat.AVAILABLE;
        }
    }

    boolean sit(int position, int num) {
        for (int i = position; i < position + num; i++) {
            if (seat[i % seat.length] != Seat.AVAILABLE) {
                return false;
            }
        }
        for (int i = position; i < position + num; i++) {
            seat[i % seat.length] = Seat.TAKEN;
        }
        return true;
    }
}

public class Unagiya {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String[] input = scanner.nextLine().split(" ");
        int seatNum = Integer.parseInt(input[0]);
        int groupNum = Integer.parseInt(input[1]);

        LongTable table = new LongTable(seatNum);

        int sitCount = 0;
        for (int i = 0; i < groupNum; i++){
            input = scanner.nextLine().split(" ");
            int memberNum = Integer.parseInt(input[0]);
            int seatNumber = Integer.parseInt(input[1]);

            if (table.sit(seatNumber, memberNum)) {
                sitCount += memberNum;
            }
        }

        System.out.println(sitCount);
    }
}

Qu'est-ce que l'orientation objet? ?? ??

Au moment où j'ai vu ce code, un choc électrique a frappé mon corps.

Probablement réécrit en fonction de mon code.

Ensuite je passe plus de temps, J'essaierai d'écrire dans mon propre "orienté objet".

Objet d'apparence Unagiya

Je commence à penser aux personnages.

Examinons cela en référence à l'organigramme que j'ai écrit plus tôt. スクリーンショット 2018-10-27 23.01.49.png

Tout d'abord · Longue table

enum Seat {AVAILABLE,UNAVAILABLE}

De TAKEN Remplacement de la cible NON DISPONIBLE.

Et la table. Puisque la table est une table, il n'y a pas de méthode (comportement). Il existe simplement là-bas.


class LongTable {
	Seat[] seats;
	/**
	 *Constructeur pour créer une table
	 *La valeur initiale est DISPONIBLE
	 * @param tableNum
	 */
	LongTable(Integer tableNum) {
		this.seats = new Seat[tableNum];
		for (int i = 0; i < tableNum; i++) {
			seats[i] = Seat.AVAILABLE;
		}
	}
}

Vient ensuite le client de l'enfant Edo. Cette fois, il est un peu rapide.

S'il n'y a personne sur le siège (isSit) Asseyez-vous (assis) S'il y a une personne sur le siège (isSit), rentrez chez vous

class Guest {
	/**
	 *Une méthode de lancer vrai s'il n'y a personne dans le siège choisi par le client
	 * @param guestNum
	 * @param choiceNum
	 * @param table
	 * @return
	 */
	public static Boolean isSit(Integer guestNum, Integer choiceNum, LongTable table) {
		Boolean seatConfirmation = true;
		for (int i = choiceNum; i < choiceNum + guestNum; i++) {
			if (table.seats[i % table.seats.length] == Seat.UNAVAILABLE) {
				seatConfirmation = false;
			}
		}
		return seatConfirmation;
	}
	/**
	 *Une méthode dans laquelle un client s'assoit et rend le siège INDISPONIBLE
	 * @param guestNum
	 * @param choiceNum
	 * @param table
	 */
	public static void sitting(Integer guestNum, Integer choiceNum, LongTable table) {
		for (int i = choiceNum; i < choiceNum + guestNum; i++) {
			table.seats[i % table.seats.length] = Seat.UNAVAILABLE; 
		}
	}
}

Ensuite, compter le nombre de personnes assises sur le siège, c'est ... Peut-être serez-vous le personnel du magasin.

class Staff {
	/**
	 *Méthode pour compter le nombre de personnes assises
	 * @param table
	 * @return count(Comptez le nombre de sièges INDISPONIBLES)
	 */
	public static Integer sitCount(LongTable table) {
		Integer count = 0;
		for (int i = 0; i < table.seats.length; i++) {
			if (table.seats[i] == Seat.UNAVAILABLE) {
				count++;
			}
		}
		return count;
	}
}

Les personnages sont maintenant terminés. Tout ce que vous avez à faire est de regarder la progression de l'histoire.

Description de la méthode principale

L'histoire est décrite dans la méthode principale.

public class Unagiya {
	public static void main(String[] args) throws Exception{
		//input: Obtenez une ligne de valeur d'entrée à partir de la console
		//inpuArray: stockez les nombres sur une ligne séparément dans un tableau
		Scanner scanner = new Scanner(System.in);
		String input = scanner.nextLine();
		String[] inputArray = input.split(" ");
		
		//tableNum: Nombre de sièges en Unagiya
		//toDayGuest: Combien de groupes d'invités viendront aujourd'hui
		Integer tableNum = toCastString(inputArray[0]);
		Integer toDayGuest = toCastString(inputArray[1]);
		
		LongTable table = new LongTable(tableNum);
		
		//guestNum: Nombre de personnes dans un groupe
		//choiceNum: Siège choisi par le client
		Integer guestNum = 0;
		Integer choiceNum = 0;
		for (int i = 0; i < toDayGuest; i++) {
			
			input = scanner.nextLine();
			inputArray = input.split(" ");
			
			guestNum = toCastString(inputArray[0]);
			choiceNum = toCastString(inputArray[1]);
			
			if (Guest.isSit(guestNum, choiceNum, table)) {
				Guest.sitting(guestNum, choiceNum, table);
			}
		}
		Integer count = Staff.sitCount(table);
		System.out.println(count);
	}
	/**
	 *Méthode pour convertir un nombre arabe de type chaîne en type entier
	 * @param strNum
	 * @return num
	 */
	public static Integer toCastString(String strNum) {
		Integer num = Integer.parseInt(strNum);
		return num;
	}
	
}

résultat

スクリーンショット 2018-11-13 0.18.25.png

Je suis passé sans aucun problème.

référence

https://www.slideshare.net/masuda220/ss-14263541 Cette diapositive est très utile, mais Comme la reliure est très stricte, je le fais un peu lâchement ww

Paiza

Opinions, impressions, améliorations, mes mauvais mots, recherche

C'est le deuxième article publié, bien que j'en ai peur.

J'ignore probablement l'arme, comme la compréhension implicite de Qiita.

Si vous avez lu ce qui précède, je vous serais reconnaissant de bien vouloir conserver certains registres. Merci à tous ceux qui ont lu jusqu'au bout.

Recommended Posts

Je l'ai résolu avec Java! !! Exercice Paiza "Long Table Unagiya" ~ Orienté objet ~
Je l'ai résolu avec Java! !! Exercice de Paiza "Long Table Unagiya"
[Netabare] Magasin d'anguilles de table longue (équivalent à la paiza rang B)