Класс расширяемого списка на Java

Прикладное программирование Программирование на Java Класс расширяемого списка на Java

  • В этой теме 0 ответов, 1 участник, последнее обновление 1 месяц, 2 недели назад сделано Васильев Владимир Сергеевич.
Просмотр 0 веток ответов
  • Автор
    Сообщения
    • #6864
      @admin
      StudLance.ru

      Пусть надо решить такую задачу:

      Создать класс Customer, спецификация которого приведена ниже. Определить конструкторы, set- и get- методы и метод toString(). Создать второй класс, агрегирующий массив типа Customer, с подходящими конструкторами и методами. Задать критерии выбора данных и вывести эти данные на консоль.

      Класс Customer: id, фамилия, имя, отчество, адрес, номер кредитной карточки, номер банковского счета. Найти и вывести:

      1. Список покупателей в алфавитном порядке;
      2. Список покупателей, у которых номер кредитной карточки находится в заданном интервале.

      Если вам не понятны какие-либо части решения, загляните в урок и практикум.

      В этой задаче нам нужно хранить множество покупателей, при этом список покупателей должен расширяться во время работы программы. В таком случае правильно использовать стандартный класс ArrayList. Однако, в этой задаче мы попробуем сделать нечто подобное самостоятельно.

      Сначала опишем класс Customer. Из интересного в этом классе:

      • У каждого покупателя должен быть свой id, при этом (очевидно), нам хотелось бы чтобы эти id не повторялись – это типичное требование, например, для баз данных, поэтому в языке SQL есть ключевое слово AUTO_INCREMENT. На языке Java мы тоже можем раздавать id покупателям автоматически, для этого заведем статическое поле ID — как и все статические поля, оно будет существовать в программе одном экземпляре (вне зависимости от того, сколько покупателей мы создадим). При создании покупателя выполняется id = ID++. При этом объект получает уникальное значение id (номера идут по порядку), а значение глобальной переменной ID увеличивается на единицу.
      • В задании требуется сортировать покупателей по алфавиту, для этого опять применим java.util.Comparator. В работе 4 объяснено почему он является вложенным в класс Customer.
      • Статический метод getCustomer() создает нового покупателя с неинициализированными параметрами и запрашивает у пользователя его параметры. такой метод нужен потому, что:
        1. Несмотря на автозаполнение поля id, конструктор требует много (6) параметров, значит – в функции, которая вызывает конструктор нужно будет создать и инициализировать 6 объектов правильного типа.
        2. Как после создания объекта, пользователь может легко ошибиться – забыть инициализировать поля правильным образом.

      Содержимое Customer.java:

      import java.util.Scanner;
      import java.util.*;
      class Customer {
       private int id;
       private static int ID;
      
       private String name, surname, patronymic,
       address,
       credit_сard_number, account_number;
      
       public Customer(String name_, String surname_, String patronymic_,
        String address_,
        String credit_сard_number_, String account_number_) {
        id = ID++;
        name = name_;
        surname = surname_;
        patronymic = patronymic_;
        address = address_;
        credit_сard_number = credit_сard_number_;
        account_number = account_number_;
       }
      
       public String toString() {
        String string = "";
        string = string + id + ":" + name + " " + surname + " " + patronymic +
         "." + address + " : " + credit_сard_number + " : " + account_number;
        return string;
       }
      
       public void print() {
        System.out.println(toString());
       }
      
       public void set_name(String name_) {
        name = name_;
       }
      
       public void set_surname(String surname_) {
        surname = surname_;
       }
      
       public void set_patronymic(String patronymic_) {
        patronymic = patronymic_;
       }
      
       public void set_address(String address_) {
        address = address_;
       }
      
       public void set_credit_сard_number(String credit_сard_number_) {
        credit_сard_number = credit_сard_number_;
       }
      
       public void set_account_number(String account_number_) {
        account_number = account_number_;
       }
      
       public int get_id() {
        return id;
       }
      
       public String get_name() {
        return name;
       }
      
       public String get_surname() {
        return surname;
       }
      
       public String get_patronymic() {
        return patronymic;
       }
      
       public String get_address() {
        return address;
       }
      
       public String get_credit_сard_number() {
        return credit_сard_number;
       }
      
       public String get_account_number() {
        return account_number;
       }
      
       public static Customer getCustomer(Scanner scanner) {
        Customer customer = new Customer("", "", "", "", "", "");
      
        System.out.print("name: ");
        customer.name = Common.readNotEmptyString(scanner);
      
        System.out.print("surname: ");
        customer.surname = Common.readNotEmptyString(scanner);
      
        System.out.print("patronymic: ");
        customer.patronymic = Common.readNotEmptyString(scanner);
      
        System.out.print("address: ");
        customer.address = Common.readNotEmptyString(scanner);
      
        System.out.print("credit_сard_number: ");
        customer.credit_сard_number = Common.readNotEmptyString(scanner);
      
        System.out.print("account_number: ");
        customer.account_number = Common.readNotEmptyString(scanner);
      
        return customer;
       }
      
       public static class ByNameComparator implements Comparator < Customer > {
        @Override
        public int compare(Customer left, Customer right) {
         if (left.surname != right.surname)
          return left.surname.compareTo(right.surname);
         if (left.name != right.name)
          return left.name.compareTo(right.name);
         return left.patronymic.compareTo(right.patronymic);
        }
       }
      }

      Класс содержит компаратор — это обеспечивает возможность применения стандартных алгоритмов сортировки к объектам. Подробнее описано там.

      Теперь, можно реализовать класс-массив для объектов типа Customer. Добавим в этот класс возможности добавления покупателя, вывода всех покупателей и сортировки. При добавлении элемента в массив, он должен расширяться, для этого в классе будем хранить два параметра – size (текущее количество добавленных элементов) и capacity (текущая емкость – под сколько элементов выделена память). При добавлении элемента в массив, увеличивается параметр size, однако, если он стал больше capacity – то:

      1. создается новый массив, большего размера (в этом примере – в 2 раза большего);
      2. в новый массив копируется содержимое старого массива;
      3. происходит добавление элемента в новый массив обычным образом.

      Содержимое модуля Customers.java:

      import java.util.*;
      class Customers {
       private Customer[] customers;
       private int capacity;
       private int size;
      
       public Customers(int capacity_) {
        size = 0;
        capacity = capacity_;
        customers = new Customer[capacity];
       }
      
       public Customers() {
        this(10);
       }
      
       public void push_back(Customer customer) {
        if (size < capacity) {
         customers[size] = customer;
         size++;
        } else {
         Customer[] buffer = new Customer[capacity * 2];
         for (int i = 0; i < size; ++i) {
          buffer[i] = customers[i];
         }
      
         customers = buffer;
         capacity = capacity * 2;
         customers[size] = customer;
         size++;
        }
       }
      
       public void print() {
        for (int i = 0; i < size; ++i) {
         customers[i].print();
        }
       }
      
       public void sortByName() {
        Arrays.sort(customers, 0, size, new Customer.ByNameComparator());
       }
      
       public void print_if_card_in(String a, String b) {
        for (int i = 0; i < size; ++i) {
         if (customers[i].get_credit_сard_number().compareTo(a) >= 0 &&
          customers[i].get_credit_сard_number().compareTo(b) <= 0)
          customers[i].print();
        }
       }
      }

      Итоговая диаграмма классов работы приведена на рисунке:

      Для проверки работы системы был создан модуль Main.java:

      import java.util.Scanner;
      public class Main {
       public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
      
        Customers customers = new Customers(1);
      
        while (true) {
         System.out.println(
          "Выберете пункт меню:\n" +
          "0. выйти\n" +
          "1. добавить покупателя\n" +
          "2. вывод покупателей в алфавитном порядке\n" +
          "3. вывод покупателей с кредитной картой в интервале\n" +
          ": "
         );
         int choice = scanner.nextInt();
         if (choice == 0)
          break;
         if (choice < 1 || choice > 3) {
          System.out.println("выбран неправильный пункт меню, повторите ввод.");
          continue;
         }
      
         switch (choice) {
          case 1:
           customers.push_back(Customer.getCustomer(scanner));
           break;
          case 2:
           customers.sortByName();
           customers.print();
           break;
          case 3:
           System.out.println("Введи диапазон кредитных карт\n");
           System.out.println("От: ");
           String from = Common.readNotEmptyString(scanner);
           System.out.println("До: ");
           String to = Common.readNotEmptyString(scanner);
           customers.print_if_card_in(from, to);
         }
        }
       }
      }

      Запустить код можно в онлайн-компиляторе.

      StudLance.ru

Просмотр 0 веток ответов
  • Для ответа в этой теме необходимо авторизоваться.
×