0
votes

Création d'objets à partir de la lecture d'un fichier qui ont également des tableaux dynamiques comme champs

J'ai un fichier texte qui contient des informations d'achat et il a une structure comme celle-ci

​​CustomerName onglet MembershipType onglet ShoppingDate onglet ProductName onglet Quantité newline

Un client peut acheter plusieurs objets différents à la fois afin que ProductName et Quantity puissent apparaître plus d'une fois comme ceci

XXX

J'essaie actuellement de créer un objet client à partir de ces données, voici mon implémentation

import java.io.File;
import java.io.FileNotFoundException;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws FileNotFoundException, ParseException {
        Scanner shoppingList = new Scanner(new File("shoppingList.txt");
        shoppingList.useDelimiter("[\t\n]");

        Customer[] customers = new Customer[0];
        while (shoppingList.hasNext()) {
            String customerName = shoppingList.next();
            String customerMembershipType = shoppingList.next();
            String purchaseDate = shoppingList.next();

            SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.yyyy");
            Date date = formatter.parse(purchaseDate);

            String[] productNameList = new String[0];
            int[] quantityList = new int[0];
            while (shoppingList.hasNext()) {
               //this is where i stuck 
            }
            Customer[] newCustomer = new Customer(customerName, customerMembershipType, purchaseDate, productNameList, quantityList);
            customers = addCustomer(customers, newCustomer);
        }
    }

        private static Customer[] addCustomer(Customer[] customers, Customer customerToAdd) {
        Customer[] newCustomers = new Customer[customers.length + 1];
        System.arraycopy(customers, 0, newCustomers, 0, customers.length);
        newCustomers[newCustomers.length - 1] = customerToAdd;
        return  newCustomers;
    }

    static class Customer {
        protected String customerName;
        protected String customerMembershipType;
        protected Date purchaseDate;
        protected String[] productNameList;
        protected int[] quantityList;

        public Customer(String customerName, String customerMembershipType, Date purchaseDate, String[] productNameList, int[] quantityList) {
            this.customerName = customerName;
            this.customerMembershipType = customerMembershipType;
            this.purchaseDate = purchaseDate;
            this.productNameList = productNameList;
            this.quantityList = quantityList;  
    }
}

Fondamentalement, je veux créer des objets client qui peuvent détiennent des listes de noms de produits et la liste de leurs quanitites, mais comme les tableaux sont immuables et que les clients peuvent acheter une quantité illimitée de type de produit, je ne peux pas trouver une solution sans utiliser arrayLists, mais je ne peux pas l'utiliser dans cette mission. Que puis-je faire à ce stade?


1 commentaires

Vous pouvez faire quelque chose comme ceci: List productNameList = new ArrayList () <>; List quantiryList = new ArrayList () <>; productNameList.add ("élément"); quantitéList.add (1);


3 Réponses :


1
votes

Je suggère qu'au lieu d'essayer de lire les lignes de clients ET d'analyser ces lignes, vous le faites séparément, c'est-à-dire que vous lisez les lignes comme des lignes, avec une ligne par client, puis analysez les lignes selon votre logique.

Quelque chose comme ci-dessous (notez que j'ai changé la représentation du client, ainsi que les clients sont maintenant une liste au lieu d'un tableau):

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException, ParseException {
        BufferedReader reader = new BufferedReader(new FileReader(new File("shoppingList.txt")));

        List<Customer> customers = new ArrayList<>();
        for (String line = reader.readLine(); line != null; line = reader.readLine()) {
            Scanner shoppingList = new Scanner(line);
            String customerName = shoppingList.next();
            String customerMembershipType = shoppingList.next();
            String purchaseDate = shoppingList.next();

            SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.yyyy");
            Date date = formatter.parse(purchaseDate);

            Customer customer = new Customer(customerName, customerMembershipType, date);

            while (shoppingList.hasNext()) {
                customer.addProduct(shoppingList.next(), shoppingList.nextInt());
            }
        }
    }

    static class Customer {
        protected String customerName;
        protected String customerMembershipType;
        protected Date purchaseDate;
        protected Map<String, Integer> products = new HashMap<>();

        public Customer(String customerName, String customerMembershipType, Date purchaseDate) {
            this.customerName = customerName;
            this.customerMembershipType = customerMembershipType;
            this.purchaseDate = purchaseDate;
        }

        public void addProduct(String name, int qty) {
            products.put(name, qty);
        }
    }
}


0 commentaires

0
votes

La solution la plus simple à laquelle je puisse penser est de: créer un nouveau tableau avec une taille plus grande (disons doubler la taille de l'ancien) lorsque l'ancien est plein, puis copier les éléments dans le nouveau tableau.


0 commentaires

0
votes

La lecture des informations article par article comme celle-ci pose deux problèmes: vous ne savez pas combien de choses la liste d'achats contient comme vous l'avez découvert, mais pire: vous ne savez pas où se termine la liste d'achats et les données pour un nouveau client commence.

Donc, ce que je ferais, c'est lire le fichier ligne par ligne, et diviser la ligne par le séparateur.

        int itemIndex = 3;
        for (int i = 0; i < productCount; i++) {
            productNameList[i] = lineItems[itemIndex];
            itemIndex = itemIndex + 1; // advance to next item in the line

            quantityList[i] = Integer.parseInt(lineItems[itemIndex]);
            itemIndex = itemIndex + 1; // advance to next item in the line
        }

Maintenant, vous savez qu'après ceux-ci Les 3 premiers articles, le reste des articles sont des noms de produits et des quantités. Vous pouvez calculer le nombre de produits en utilisant la taille de lineItems:

        int productCount = (lineItems.length - 3)/2;
        String[] productNameList = new String[productCount];
        int[] quantityList = new int[productCount];

L'ajout des valeurs dans ces tableaux est maintenant simple pour la boucle: p>

    while (shoppingList.hasNextLine()) {
        String line = shoppingList.nextLine();
        String[] lineItems = line.split("\t");

        String customerName = lineItems[0];
        String customerMembershipType = lineItems[1];
        String purchaseDate = lineItems[2];
        // and so on


0 commentaires