Java >> Tutoriel Java >  >> Java

Programme fin de bibliothèque en Java

Programme fin de bibliothèque en Java. City Library Fine Report en Java. Les détails de l'utilisateur sont donnés dans le fichier, lisez ce fichier, obtenez les jours, calculez l'amende et stockez le montant de l'amende et le nom d'utilisateur dans un fichier séparé.

Description : - Rapport détaillé de la bibliothèque municipale en Java

La Bibliothèque municipale envisage d'informatiser son travail afin d'offrir un service efficace. Dans un premier temps, il vous est demandé de créer un système pouvant être utilisé pour gérer la génération de rapports de la bibliothèque, en particulier pour calculer et générer les rapports pour les détails d'affinement pour chaque utilisateur. Créez un nouveau projet nommé S16xxxQ1 pour le programme fin de bibliothèque en Java et implémentez la fonctionnalité décrite ci-dessous.

a. Créez une méthode pour lire les données de l'amende "fineDetails.txt" stocké dans votre lecteur domestique (D:/) et stockez les données en utilisant une structure de données appropriée. Deux exemples de lignes de données sont donnés ci-dessous.

Nom d'utilisateur Nom du livre Nombre de jours (retard)
Émilie L'identité Bourne 5
Michel La liste 15

Remarque :- Le fichier texte réel (fineDetails.txt) contient des champs de données séparés par des virgules. ↓ Téléchargez le fichier fineDetails.txt.

Le fichier "fineDetails.txt" contient,

Emily,The Bourne Identity,5
Michael,The List,15
Jacob,Lord of the Rings,8
Emma,Twilight-New Moon,25
Sarah,Stormlight Archive,2
Grace,Tower of Darkness,20
Jack,Tangled,9
Alexis,Last Sacrifice,13
Jasmine,Third Twin,11
Eric,The Goblet of Fire,25

b. Créez une autre méthode qui peut être utilisée pour calculer les amendes pour chaque utilisateur et écrivez-les dans un fichier nommé fineReport.txt. Les détails du calcul sont les suivants.

Période d'amende - Après la date de retour Montant de l'amende
Première semaine (du jour 1 au jour 7) 1 USD par jour
Deuxième semaine (du jour 8 au jour 14) 3 $ par jour
Après la deuxième semaine 5 $ par jour

Exemple :-

Bien pour Emily => 5 * 1 =5/-
Bien pour Michael => (7 * 1) + (7 * 3) + (1 * 5) =33/-

Format de sortie

Le format de sortie de Java Library Fine Program doit être écrit comme suit :-

Emily,5
Michael,33
Jacob,10
Emma,83
Sarah,2
Grace,58
Jack,13
Alexis,25
Jasmine,19
Eric,83

Solution pour le programme Library Fine en Java

Afin de lire les données caractère/texte d'un fichier ligne par ligne, la classe BufferedReader offre des performances élevées par rapport aux autres classes. De même, la classe PrintWriter offre de meilleures performances pour écrire des données de caractères/texte dans un fichier. Par conséquent, nous utiliserons les classes BufferedReader et PrintWriter dans cet exemple.

Pour stocker les valeurs utilisateur, nous utilisons la collection ArrayList. Nous allons créer une classe d'utilisateurs distincte qui représentera chaque utilisateur indiqué dans le fichier.

Remarque :- Le code complet est enfin donné.

Créer une classe d'utilisateurs

Tout d'abord, créons une classe d'utilisateurs ayant des propriétés :nom d'utilisateur, nom de livre et jours de retard. Fournissez un constructeur pour initialiser les valeurs. Étant donné que nous avons besoin d'obtenir des jours de retard à des fins de calcul précis et un nom d'utilisateur à stocker dans le rapport final, fournissez donc une méthode getter pour y accéder.

// User.java
public class User {

  // User properties
  private String username;
  private String book;
  private Integer days;

  // constructor
  public User(String username, String book, Integer days) {
    this.username = username;
    this.book = book;
    this.days = days;
  }

  // important getter methods required in test class
  public String getUsername() {
    return username;
  }
  public Integer getDays() {
    return days;
  } 
}

Comment lire les entrées du fichier ?

En Java, la classe BufferedReader est le moyen le plus amélioré de lire les données de caractères ou de texte à partir du fichier/clavier/réseau. BufferedReader lui-même ne peut pas se connecter directement à un fichier/mot-clé, pour se connecter à un fichier, il peut prendre l'aide de la classe FileReader, et pour se connecter au mot-clé, il peut prendre l'aide de la classe InputStreamReader. En savoir plus sur la classe BufferedReader en Java.

//  BufferedReader class object to read input from the file
// fineReport.txt located in D drive.
BufferedReader br = new BufferedReader(
                    new FileReader("D:\\fineReport.txt"));

Les séparateurs dépendent de la plate-forme. Pour séparer le répertoire parent et enfant dans Windows, nous utilisons des séparateurs de fichiers "\", mais dans le programme Java pour représenter "\", nous devons utiliser le caractère de séquence d'échappement "\\". Sous Windows, nous devons utiliser "\\", et sous Linux, nous devons utiliser "/". Le code ci-dessus n'est valable que pour le système d'exploitation Windows. En savoir plus sur la création d'objets Fichier avec chemin d'accès complet au fichier ou au répertoire et séparateur de fichiers.

Dans la classe BufferedReader, nous avons la méthode readLine() qui peut lire une ligne à la fois. Dans notre exemple, une ligne contient le nom d'utilisateur, le nom du livre et la date de fin séparés par une virgule. Par conséquent, lisez une ligne et séparez-la de la virgule (,).

// read one line
String line = br.readLine();
// seperate it from comma
String str[] = line.split(",");

Maintenant, la ligne est séparée en trois parties et stockée dans le tableau de Strings. Par exemple, il divisera la ligne "Michael, The List, 15" en,

str[0] = "Michael";
str[1] = "The List";
str[2] = "15";

Actuellement, toutes ces valeurs sont au format String. Mais le "15" représente les derniers jours, il doit donc être converti de String en valeur int.

int days = Integer.parseInt(str[2]);

Comment stocker des données ?

Pour stocker des données, nous pouvons utiliser la classe ArrayList. Avantages de l'utilisation de la collection ArrayList au lieu d'un tableau :- Le tableau a une taille limitée et nous devons spécifier la taille du tableau lors de la création de l'objet tableau. Mais ArrayList est extensible dynamiquement, sans limitation de taille, et pas besoin de spécifier la taille.

// ArrayList object creation to store User values.
ArrayList<User> user = new ArrayList<User>();

Pour stocker username=”Michael”, book=”The List”, et days=15 nous pouvons écrire le code comme,

// adding values to ArrayList
user.add(new User("Michael", "The List", 15));

Comment calculer l'amende ?

Pour calculer l'amende, obtenez d'abord les jours de retard. En fonction de la condition, écrivez la logique pour calculer l'amende.

  • Pour tard-journée <=7 alors fin =jours * 1 ;
  • Pour les journées tardives> 7 et <=14 puis fin =(fin pour les 7 premiers jours) + (jours-7)*3
  • Et pendant plus de 14 jours =(amende pour les 7 premiers jours) + (amende pour les 7 prochains jours) + (jours-14)*5

La logique ci-dessus peut être écrite comme,

// loop to iterate the list
for (User usr : user) {

  // get late days
  days = usr.getDays();

  // calculate fine amount
  if(days <= 7)
    fine = days * 1;
  else if(days <= 14)
    fine = 7*1 + (days-7)*3;
  else
    fine = 7*1 + 7*3 + (days-14)*5;
} 

Comment stocker les valeurs dans File ?

En Java, la classe PrintWriter est le Writer le plus amélioré pour écrire des données de caractères ou de texte dans le fichier. Le plus grand avantage de PrintWriter par rapport à FileWriter et BufferedWriter est :- nous pouvons écrire n'importe quelle donnée primitive directement avec ou sans caractère de nouvelle ligne, et les méthodes de la classe PrintWriter ne lancent jamais d'IOExceptions. En savoir plus sur la classe PrintWriter en Java

// create PrintWriter object
PrintWriter pw = new PrintWriter("D:\\fineReport.txt");

Les données seront enregistrées dans le fichier "fineReport.txt" dans le lecteur D. Si le fichier n'existe pas, le constructeur lui-même crée un nouveau fichier, mais le fichier avec le même nom et la même extension existe, il remplacera le fichier.

Supposons que nous ayons une chaîne "Michael" et une valeur entière 5 qui doit être insérée dans le fichier, nous pouvons l'écrire comme,

// values which should to store
String name = "Michael";
int fine = 5;

// store the value in String form
pw.println(name+","+fine);

Notez que le résultat sera stocké sous forme de chaîne, et ils sont séparés par la ligne "\n" et chaque ligne contiendra des valeurs séparées par des virgules.

Code pour le programme Library Fine en Java

La structure du fichier projet dans Eclipse IDE,

Programme Library Fine en Java

La classe Utilisateur,

// User.java
package com.kp.entity;
public class User {
  private String username;
  private String book;
  private Integer days;

  // constructor
  public User(String username, String book, Integer days) {
    this.username = username;
    this.book = book;
    this.days = days;
  }

  // important getter methods required in test class
  public String getUsername() {
    return username;
  }
  public Integer getDays() {
    return days;
  } 
}

Classe de bibliothèque,

// Library.java
package com.kp.test;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.PrintWriter;
import java.util.ArrayList;

import com.kp.entity.User;

public class Library {

  public static void main(String[] args) {
    // create list of User to store details
    ArrayList<User> user = new ArrayList<User>();
    try {
      // In this example fineDetails.txt is stored
      // at D drive (D:\) in Windows operating system.
      
      // read data from file and store in list
      read(user, "D:\\fineDetails.txt");

      // calculate fine and store in "fineReport.txt"
      calculateFine(user, "D:\\fineReport.txt");
      
      // display some message
      System.out.println("Fine report is saved.");
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  // method to read data from the fine “fineDetails.txt”
  // stored in your home (H:/) drive
  // and store the data using a suitable data structure
  public static void read(ArrayList<User> user,
                       String string) throws Exception {
    // variables
    BufferedReader br = null;
    String line = null;
    String str[] = null;
    int days = 0;
    
    // create BufferedReader object
    br = new BufferedReader(new FileReader(string));

    // read till end of the file
    while (br.ready()) {
      // read one line
      line = br.readLine();

      // Split line by comma(,)
      str = line.split(",");

      // convert String to int (for days)
      days = Integer.parseInt(str[2]);

      // store details to ArrayList
      user.add(new User(str[0], str[1], days));
    }
    
    // close BufferedReader
    br.close();
  }

  // method to calculate fine and store in "fineReport.txt"
  public static void calculateFine(ArrayList<User> user,
              String string) throws Exception {
    // variables
    PrintWriter pw = null;
    int days = 0;
    int fine = 0;
    
    // create PrintWriter object
    pw = new PrintWriter(string);
    
    // loop to iterate the list
    for (User usr : user) {
      // get late days
      days = usr.getDays();
      
      // calculate fine amount
      if(days <= 7)
        fine = days * 1;
      else if(days <= 14)
        fine = 7*1 + (days-7)*3;
      else
        fine = 7*1 + 7*3 + (days-14)*5;
      
      // store values
      pw.println(usr.getUsername() + "," + fine);
    } 
    
    // close Stream
    pw.close();
  }
}

Balise Java