Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/29: Рейтинг темы: голосов - 29, средняя оценка - 4.62
 Аватар для robotcode
28 / 8 / 6
Регистрация: 20.09.2017
Сообщений: 133

Задача "Заказы в кафе"

02.02.2018, 00:25. Показов 5799. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток
Буду очень благодарен если кто подскажет алгоритм решения данной задачи

Разработать иерархию классов, для хранения информации о сделанных заказах клиентами в кафе. Для идентификации клиента использовать информацию о номере столика и времени посещения. По каждому клиенту (столику, за период) вывести общую (среднюю) стоимость сделанных заказов. Разработать консольное приложение, позволяющее вводить, редактировать и удалять всю необходимую информацию. Предусмотреть сохранение и загрузку введённых данных как в/из текстовый файл, так и в бинарный
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.02.2018, 00:25
Ответы с готовыми решениями:

Разработка программы «Кафе», содержащей информацию о работе кафе
Pазработка программы «Кафе», содержащей информацию о работе кафе. Можно использовать массивы, методы, циклы C# Пожалуйста срочно!!!!...

Вывести заказы созданные пользователем, который не разу не выполнял заказы
Такая проблема: есть 2 таблицы в одной содержатся заказы, кто их создал и кто исполнил, в другой имя пользователя. Надо вывести заказы...

Заказы появляются с опозданием, невидимые заказы
Здравствуйте! Вопрос следующий - владелец магазина жалуется на проблему, клянется, что некоторые заказы появляются с опозданием на день. Т....

18
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
02.02.2018, 11:26
Лучший ответ Сообщение было отмечено robotcode как решение

Решение

Исходя из условия, сюда можно (и имхо нужно) притянуть паттерн Visitor для реализации взаимодействия клиент-столик. Покажу архитектуру на примере вычисления средних чеков, файлы и данные за период допилить сами сможете. Счета рандомные для простоты.
Java
1
2
3
public interface Visitor {
    void visit(final Table table);
}
Java
1
2
3
4
5
6
7
public class Client implements Visitor{
 
    @Override
    public void visit(final Table table) {
        table.addBill(Bill.newRandomBill());
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Bill {
    private static final ThreadLocalRandom RNG = ThreadLocalRandom.current();
 
    private String timeOfPayment;
 
    private double mealCost;
 
    public Bill(final String timeOfPayment, final double mealCost) {
        this.timeOfPayment = timeOfPayment;
        this.mealCost = mealCost;
    }
 
    public String getTimeOfPayment() {
        return timeOfPayment;
    }
 
    public double getMealCost() {
        return mealCost;
    }
 
    public static Bill newRandomBill() {
        final String TIME = String.format("%02d:%02d", RNG.nextInt(25), RNG.nextInt(60));
        final double COST = RNG.nextDouble(1.0, 100.0);
        return new Bill(TIME, COST);
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class Table {
    private static int instanceCounter;
 
    private final List<Bill> bills;
 
    private final int number;
 
    public Table() {
        this.bills = new ArrayList<>();
        this.number = ++instanceCounter;
    }
 
    public int getNumber() {
        return number;
    }
 
    public void serve(final Visitor visitor) {
        visitor.visit(this);
    }
 
    public void addBill(final Bill bill) {
        bills.add(bill);
    }
 
    public double calculateAverageBill() {
        double sum = 0.0;
 
        for (final Bill bill : bills) {
            sum += bill.getMealCost();
        }
 
        return sum / bills.size();
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Main {
    public static void main(String[] args) {
        final ThreadLocalRandom rng = ThreadLocalRandom.current();
 
        final int maxTablesCount = 4;
        final int minClientCount = 1;
        final int maxClientCount = 4;
 
        final List<Table> tables = new ArrayList<>(maxTablesCount);
 
        for (int i = 0; i < maxTablesCount; i++) {
            tables.add(new Table());
        }
 
        tables.forEach(table -> {
            final int clientCount = rng.nextInt(minClientCount,maxClientCount + 1);
            for (int i = 0; i < clientCount; i++) {
                table.serve(new Client());
            }
        });
 
        tables.forEach(table -> System.out.println(String.format("table %d, avg = %.2f$",
                table.getNumber(), table.calculateAverageBill())));
    }
}
3
 Аватар для al1as
386 / 74 / 31
Регистрация: 13.04.2012
Сообщений: 127
02.02.2018, 14:04
HighPredator, в Bill.newRandomBill() для часов по идее надо RNG.nextInt(24) вместо RNG.nextInt(25), а то так получаем две разных строки для одного и того же времени (24.00-24.59 и 00.00-00.59).

Идею с Visitor'ом я не совсем понял, его же вроде применяют тогда, когда нужно добавить новую функциональность, не меняя сам класс, и при этом может нарушаться инкапсуляция этого класса. А здесь мы по сути используем уже существующую функциональность из класса Table, и это выглядит, как ненужное нагромождение. То есть мы по сути могли бы просто сделать такой же класс Client, дописать туда метод visitTable(Table t) и добавить в t новый bill. По логике мы должны передать сам список Bills, чтобы Visitor мог при случае реализовать новую функциональность без изменения класса Table. К примеру, ещё один Visitor - какой-нибудь администратор, и ему нужно среднее значение по чекам. А какой-нибудь повар интересуется, сколько блюд, которые готовит он, в чеках по каждому столику. Если передавать Table, то каждый раз придётся в самом классе Table дописывать новые методы, а это не очень хорошо (класс же вроде должен иметь только одну причину для изменения).

Не по теме:

Опыта с паттернами практически нет, просто пытаюсь разобраться..

0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
02.02.2018, 14:07
HighPredator, спасибо за такие полезные и наглядные примеры!
Нижайшая просьба - объясни неразумному падавану, зачем в данном случае нужен интерфейс Visitor? Заранее спс.
0
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
02.02.2018, 14:17
Цитата Сообщение от al1as Посмотреть сообщение
в Bill.newRandomBill() для часов по идее надо
Согласен, писал на скорую руку, просто чтоб данные хоть какие были.
Цитата Сообщение от al1as Посмотреть сообщение
Идею с Visitor'ом я не совсем понял
Цитата Сообщение от iSmokeJC Посмотреть сообщение
зачем в данном случае нужен интерфейс Visitor
Попробуйте сначала раскурить самостоятельно. Под катом код-образец с вики.
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
public class Demo {
    public static void main ( String [] args ) {
        Point p = new Point2d( 1, 2 );
        Visitor v = new Chebyshev();
        p.accept( v );
        System.out.println( p.getMetric() );
    }
}
 
interface Visitor {
    public void visit ( Point2d p );
    public void visit ( Point3d p );
}
 
abstract class Point {
    public abstract void accept ( Visitor v );
    private double metric = -1;
    public double getMetric () {
        return metric;
    }
    public void setMetric ( double metric ) {
        this.metric = metric;
    }
}
 
class Point2d extends Point {
    public Point2d ( double x, double y ) {
        this.x = x;
        this.y = y;
    }
    
    public void accept ( Visitor v ) {
        v.visit( this );
    }
    
    private double x;
    public double getX () { return x; }
    
    private double y;
    public double getY () { return y; }
}
 
class Point3d extends Point {
    public Point3d ( double x, double y, double z ) {
        this.x = x;
        this.y = y;
        this.z = z;
    }
    public void accept ( Visitor v ) {
        v.visit( this );
    }
    
    private double x;
    public double getX () { return x; }
    
    private double y;
    public double getY () { return y; }
    
    private double z;
    public double getZ () { return z; }
}
 
class Euclid implements Visitor {
    public void visit ( Point2d p ) {
        p.setMetric( Math.sqrt( p.getX()*p.getX() + p.getY()*p.getY() ) );
    }
    public void visit ( Point3d p ) {
        p.setMetric( Math.sqrt( p.getX()*p.getX() + p.getY()*p.getY() + p.getZ()*p.getZ() ) );
    }
}
 
class Chebyshev implements Visitor {
    public void visit ( Point2d p ) {
        double ax = Math.abs( p.getX() );
        double ay = Math.abs( p.getY() );
        p.setMetric( ax>ay ? ax : ay );
    }
    public void visit ( Point3d p ) {
        double ax = Math.abs( p.getX() );
        double ay = Math.abs( p.getY() );
        double az = Math.abs( p.getZ() );
        double max = ax>ay ? ax : ay;
        if ( max<az ) max = az;
        p.setMetric( max );
    }
}
Попробуйте найти для себя ответ на следующие вопросы:
1) что соответствует методу accept из вики?
2) насколько сложно клиенту будет посетить бар, если такая сущность добавится?

Если не будет понятно, тогда постараюсь ответить на вопросы.
2
 Аватар для al1as
386 / 74 / 31
Регистрация: 13.04.2012
Сообщений: 127
02.02.2018, 15:30
Цитата Сообщение от HighPredator Посмотреть сообщение
1) что соответствует методу accept из вики?
Table.serve()
Цитата Сообщение от HighPredator Посмотреть сообщение
2) насколько сложно клиенту будет посетить бар, если такая сущность добавится?
Добавить сигнатуру метода visit(Bar b) в интерфейс Visitor и реализовать его в классе Client. Я не очень понимаю, как Visitor здесь нам помогает, я ведь точно так же добавлю метод visit(Bar b) в простой класс Client и буду вызывать методы b, как обычно.
Но в этом примере из вики Visitor'ы добавляют новую функциональность, а в нашем - нет: они просто вызывают уже существующий метод... и принцип одной обязанности всё равно нарушен для класса Table (в его задачу явно не входит расчёт всевозможных статистик, которые внезапно нам понадобились). То есть, задачу подсчёта среднего по счетам нужно делегировать Visitor'у в моём понимании и передавать ему копию списка счетов. Я про это:
Цитата Сообщение от al1as Посмотреть сообщение
По логике мы должны передать сам список Bills, чтобы Visitor мог при случае реализовать новую функциональность без изменения класса Table. К примеру, ещё один Visitor - какой-нибудь администратор, и ему нужно среднее значение по чекам. А какой-нибудь повар интересуется, сколько блюд, которые готовит он, в чеках по каждому столику. Если передавать Table, то каждый раз придётся в самом классе Table дописывать новые методы, а это не очень хорошо (класс же вроде должен иметь только одну причину для изменения).
А Client сделать обычным классом, который вызывает методы у Table. В принципе, можно сделать общий абстрактный класс "Заведение", а бар с кафе отнаследуются от него. Тогда при добавлении бара вообще никаких проблем не должно возникать (если он использует для счетов тот же класс Bill, а если какой-то другой, то добавить новый метод visit(..) в Visitor). Да и сам Bill, по-хорошему, "таскать" между классами не надо, а добавить в Table (или общий класс "Заведение") методы addRandomBill(), addBill(date, price), к примеру, а что там внутри используется клиенту знать не обязательно.

Не по теме:

То есть мне всё равно не понятно, какие плюсы от использования такого Visitor'a мы получаем...
P.S. Извините за много букв, по-другому не умею

0
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
02.02.2018, 16:25
Цитата Сообщение от al1as Посмотреть сообщение
Я не очень понимаю, как Visitor здесь нам помогает
Попробуйте рассмотреть задачу с общей стороны. У вас есть столик в кафе и есть разные люди. Эти люди выполняют над этим столом действия: клиенты едят, официанты убирают и т.д. у вас есть субъекты и объект. Механически, это формальное определение данного паттерна
Посетитель (англ. visitor) — поведенческий шаблон проектирования, описывающий операцию, которая выполняется над объектами других классов
Посмотрим (пофантазируем) дальше. Пусть мы имеем кафе-бар, т.е. типичное заведение, где есть бар со стойкой и столики с едой. У нас есть клиенты и персонал, которые могут "посещать" и то и другое. Таким образом, мы имеем две иерархии: объектов и субъектов. Это тоже соответствует концепции паттерна. Ибо и над столом и над баром надо выполнять более одного действия по условию задачи. Это я сделал только одну для примера. Согласен, если бы в задаче явно было написано что
есть также бар, официанты и т.д.
все стало бы более явно.

Посмотрим на детали. По поводу счета. Если вы посмотрите внимательно на пример из вики, то вы увидите, что посетитель в процессе посещения каждого объекта в иерархии точек, изменяет их внутреннее состояние через их публичное АПИ. То же самое сделал и я со столом.

В качестве подкрепления вышесказанного предлагаю следующий рефакторинг: запилим еще один тип поситителя -- менеджера, который будет собирать средний чек со стола после того, как все клиенты поедят. Приведем к такому виду:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class Table {
    private static int instanceCounter;
 
    private final List<Bill> bills;
 
    private final int number;
 
    public Table() {
        this.bills = new ArrayList<>();
        this.number = ++instanceCounter;
    }
 
    public int getNumber() {
        return number;
    }
 
    public void accept(final Visitor visitor) {
        visitor.visit(this);
    }
 
    public void addBill(final Bill bill) {
        bills.add(bill);
    }
 
    public List<Bill> getCopyOfBills() {
        return new ArrayList<>(bills);
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Manager implements Visitor {
    private double averageBill;
 
    @Override
    public void visit(final Table table) {
        averageBill = calculateAverageBill(table.getCopyOfBills());
    }
 
    public double getAverageBill() {
        return averageBill;
    }
 
    private double calculateAverageBill(final List<Bill> bills) {
        double sum = 0.0;
 
        for (final Bill bill : bills) {
            sum += bill.getMealCost();
        }
 
        return sum / bills.size();
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Main {
    public static void main(String[] args) {
        final ThreadLocalRandom rng = ThreadLocalRandom.current();
 
        final int maxTablesCount = 4;
        final int minClientCount = 1;
        final int maxClientCount = 4;
 
        final List<Table> tables = new ArrayList<>(maxTablesCount);
 
        for (int i = 0; i < maxTablesCount; i++) {
            tables.add(new Table());
        }
 
        Manager manager = new Manager();
 
        tables.forEach(table -> {
            final int clientCount = rng.nextInt(minClientCount,maxClientCount + 1);
            for (int i = 0; i < clientCount; i++) {
                table.accept(new Client()); // serving client
            }
            table.accept(manager); // manager collects average data
            System.out.println(String.format("table %d, avg = %.2f$", table.getNumber(), manager.getAverageBill()));
        });
    }
}
Теперь вы видите, для чего все затевалось?
5
 Аватар для al1as
386 / 74 / 31
Регистрация: 13.04.2012
Сообщений: 127
02.02.2018, 16:38
Цитата Сообщение от HighPredator Посмотреть сообщение
Теперь вы видите, для чего все затевалось?
Ну, да, об этом я и думал, что Visitor'ы сами должны считать среднее и пр. статистику. И когда нам нужен новый вид статистики, мы добавляем новый вид Visitor'a, вместо изменения класса Table. Просто по первоначальной версии сложилось впечатление, что сам столик всё будет рассчитывать, а они будут только вызывать соотв. методы, поэтому я и не понял смысла.
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
02.02.2018, 18:53
Вот! С появлением класса Manager все стало намного понятнее.
HighPredator, спасибо огромное еще раз. Снимаю шляпу!
0
 Аватар для Сергей_СПб
28 / 3 / 1
Регистрация: 13.12.2017
Сообщений: 192
02.02.2018, 20:36
robotcode, слинял по тихому, пока не прилетело. нервно курит в сторонке.
HighPredator, действительно спасибо.
0
 Аватар для robotcode
28 / 8 / 6
Регистрация: 20.09.2017
Сообщений: 133
03.02.2018, 00:09  [ТС]
HighPredator, спасибо за ответ....теперь нужно все это пережевать )
0
 Аватар для Сергей_СПб
28 / 3 / 1
Регистрация: 13.12.2017
Сообщений: 192
03.02.2018, 14:16
Цитата Сообщение от HighPredator Посмотреть сообщение
Посмотрим (пофантазируем) дальше. Пусть мы имеем кафе-бар, т.е. типичное заведение, где есть бар со стойкой и столики с едой.
. Может получиться хорошая программа для обучения с нуля.
С позволения автора темы и чтобы не засорять выше написанные скрижали HighPredator, перейду в новую тему, где попробую осознать выше написанное
Цитата Сообщение от robotcode Посмотреть сообщение
теперь нужно все это пережевать
, написать подобное на классике (знакомыми буковами) и ... огрести своих плюх от
Цитата Сообщение от xoraxax Посмотреть сообщение
Зачем ты это сюда принес?
0
 Аватар для robotcode
28 / 8 / 6
Регистрация: 20.09.2017
Сообщений: 133
05.02.2018, 02:50  [ТС]
Вот мое решение этой задачи.
Многое конечно можно было запихать в методы, но пока так как есть
Java изучаю чуть больше месяца поэтому с удовольствием принимаю все советы-замечания

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
package com.company;
 
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
 
public class Main {
 
    public static void main(String[] args) throws FileNotFoundException, IOException {
 
        int q = 0;
        ListProducts listOfProducts = new ListProducts();
        OrderList orderList = new OrderList();
        Order productorder = null;
 
        Scanner scanner = new Scanner(System.in); //для чисел
        Scanner scanner1 = new Scanner(System.in); //для строк
 
        do {
            System.out.println("Select menu item");
            System.out.println("1 - Products  2 - Orders   3 - Exit");
 
            q = scanner.nextInt();
 
            switch (q) {
                case 1:
                    do {
                        System.out.println("Select menu item");
                        System.out.println("1 - Add product 2 - Edit product  3 - Delete product  4 - Save products  5 - Load products  6 - Show products  7 - Exit");
                        q = scanner.nextInt();
                        switch (q) {
                            case 1:
                                System.out.println("Enter name of product");
                                String name = scanner1.nextLine();
                                System.out.println("Enter cost of product");
                                int cost = scanner.nextInt();
                                listOfProducts.addProduct(new Product(name, cost));
                                break;
 
                            case 2:
                                listOfProducts.showProducts();
                                System.out.println("Enter code of product");
                                int q1 = scanner.nextInt();
                                System.out.println("Enter new name of product");
                                String name1 = scanner1.nextLine();
                                System.out.println("Enter new cost of product");
                                int cost1 = scanner.nextInt();
                                Product Pr1 = listOfProducts.getidProduct(q1);
                                listOfProducts.editProduct(Pr1, name1, cost1);
                                break;
 
                            case 3:
                                listOfProducts.showProducts();
                                System.out.println("Enter code of product");
                                int q2 = scanner.nextInt();
                                Product Pr2 = listOfProducts.getidProduct(q2);
                                listOfProducts.delProduct(Pr2);
                                break;
 
                            case 4:
                                listOfProducts.saveProducts();
                                break;
 
                            case 5:
                                listOfProducts.loadProducts();
                                break;
 
                            case 6:
                                listOfProducts.showProducts();
                                break;
                        }
                    } while (q != 7);
 
                    break;
 
                case 2:
 
                    do {
                        System.out.println("Select menu item");
                        System.out.println("1 - Add order 2 - Show orders  3 - Delete order  4 - Save order  5 - Load order 6 - Total order 7 - Average order  8 - Exit ");
                        q = scanner.nextInt();
                        switch (q) {
                            case 1:
                                System.out.println("Enter info about client");
                                System.out.println("Enter time start");
                                String time1 = scanner1.nextLine();
                                System.out.println("Enter time start end");
                                String time2 = scanner1.nextLine();
                                System.out.println("Enter the number of table");
                                int table = scanner.nextInt();
                                productorder = new Order(new Client(time1, time2, table));
 
                                System.out.println("Add products in the order");
                                do {
                                    System.out.println("1 - Add product in the order  2 - Exit");
                                    q = scanner.nextInt();
                                    switch (q) {
                                        case 1:
                                            System.out.println("Choose the product. Enter id of product");
                                            listOfProducts.showProducts();
                                            int n = scanner.nextInt();
                                            Product P = listOfProducts.getidProduct(n);
                                            productorder.addProduct(P);
                                    }
                                }
                                while (q != 2);
                                orderList.addOrder(productorder);
                                break;
 
                            case 2:
                                orderList.ordersShow();
                                break;
 
                            case 3:
                                orderList.ordersShow();
                                System.out.println("Click ID to delete the order");
                                q = scanner.nextInt();
                                Order Or = orderList.getIdOrder(q);
                                orderList.delOrder(Or);
 
                                break;
                            case 4:
                                orderList.saveOrders();
                                break;
                            case 5:
                                orderList.loadOrders();
                                break;
                            case 6:
 
                                System.out.println("Choose the Order. Enter id of order");
                                orderList.ordersShow();
                                int n = scanner.nextInt();
                                Order P = orderList.getIdOrder(n);
                                System.out.println("The total amount of the order: " + P.getSumOrder());
                                break;
                            case 7:
 
                                System.out.println("Choose the Order. Enter id of order");
                                orderList.ordersShow();
                                int t = scanner.nextInt();
                                Order R = orderList.getIdOrder(t);
                                System.out.println("The average amount of the order: " + R.getAvOrder());
                                break;
                        }
                    }
                    while (q != 8);
 
                    break;
            }
        }
        while (q != 3);
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package com.company;
 
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
 
public class Client implements Serializable {
    private String datein;
    private String dateout;
    private int table;
 
    public Client(String datein, String dateout, int table) {
        this.datein = datein;
        this.dateout = dateout;
        this.table = table;
    }
 
    public String getDatein() {
        return datein;
    }
 
    public void setDatein(String datein) {
        this.datein = datein;
    }
 
    public String getDateout() {
        return dateout;
    }
 
    public void setDateout(String dateout) {
        this.dateout = dateout;
    }
 
    public int getTable() {
        return table;
    }
 
    public void setTable(int table) {
        this.table = table;
    }
 
    @Override
    public String toString() {
        return "Client{" +
                "datein='" + datein + '\'' +
                ", dateout='" + dateout + '\'' +
                ", table=" + table +
                '}';
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package com.company;
 
import java.io.Serializable;
 
public class Product implements Serializable {
    private String name;
    private int cost;
    private int idProduct;
 
    private static int nextID = 1;
 
    public Product(String name, int cost) {
        this.name = name;
        this.cost = cost;
        this.idProduct = nextID;
        nextID = nextID + 1;
    }
 
    @Override
    public String toString() {
        return "Product{" +
                "name='" + name + '\'' +
                ", cost=" + cost +
                ", idProduct=" + idProduct +
                '}';
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public int getCost() {
        return cost;
    }
 
    public void setIdProduct(int idProduct) {
        this.idProduct = idProduct;
    }
 
    public void setCost(int cost) {
        this.cost = cost;
    }
 
    public int getIdProduct() {
        return idProduct;
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package com.company;
 
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
 
public class ListProducts {
    List<Product> listOfProducts = new ArrayList<Product>();
 
    public void addProduct(Product product) {
        listOfProducts.add(product);
    }
 
    public void delProduct(Product product) {
        listOfProducts.remove(product);
    }
 
    public void editProduct(Product product, String name, int cost) {
        product.setName(name);
        product.setCost(cost);
    }
 
    public void showProducts() {
        for (Product p : listOfProducts) {
            System.out.println(p.toString());
        }
    }
 
    public Product getidProduct(int idProduct) {
        Product product = null;
        for (Product p : listOfProducts) {
            if (p.getIdProduct() == idProduct) {
                product = p;
                break;
            }
        }
        return product;
    }
 
    public void saveProducts() throws FileNotFoundException, IOException {
        int q;
        do {
            Scanner scanner = new Scanner(System.in);
            System.out.println("1 - Save as text  2 - Save as bytecode  3 - Exit");
            q = scanner.nextInt();
            switch (q) {
                case 1:
                    for (Product Pr : listOfProducts) {
                        BufferedWriter bw = new BufferedWriter(new FileWriter("C:\\Users\\AL\\Desktop\\3 - Заказы в кафе\\productstext.txt", true));
                        bw.write(Pr + "\r\n");
                        bw.close();
                    }
 
                    break;
                case 2:
                    try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("C:\\Users\\AL\\Desktop\\3 - Заказы в кафе\\productsbyte.txt"))) {
                        //сериализация объекта делается вызовом метода writeObject() класса ObjectOutputStream
                        //Класс FileOutputStream предназначен для записи байтов в файл
                        oos.writeObject(listOfProducts);
 
                    } catch (Exception ex) {
                        System.out.println(ex.getMessage()); //getMessage() — получить сообщение об ошибке
                    }
                    break;
            }
        }
        while (q != 3);
    }
 
    public void loadProducts() throws FileNotFoundException, IOException {
        int q;
        do {
            Scanner scanner = new Scanner(System.in);
            System.out.println("1 - Load from text  2 - load from bytecode  3 - Exit");
            q = scanner.nextInt();
            switch (q) {
                case 1:
 
                    try {
                        Scanner in = new Scanner(new File("C:\\Users\\AL\\Desktop\\3 - Заказы в кафе\\productstext.txt"));
                        StringBuffer data = new StringBuffer();
                        while (in.hasNext())
                            data.append(in.nextLine()).append("\n");
                        System.out.println(data.toString());
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
 
                    break;
                case 2:
                    List<Product> products = null;
 
                    try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("C:\\Users\\AL\\Desktop\\3 - Заказы в кафе\\productsbyte.txt"))) {
                        products = (List<Product>) ois.readObject();
                        //readObject() может прочитать любой сериализованный объект, поэтому необходимо полученный объект приводить к конкретному типу.
                    } catch (Exception ex) {
 
                        System.out.println(ex.getMessage());
                    }
 
                    for (Product f : products) {
                        System.out.printf(f.toString() + "\r\n");
                    }
 
                    break;
            }
        }
        while (q != 3);
    }
 
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package com.company;
 
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
 
public class Order implements Serializable {
    Client client = null;
    List<Product> pruductOrder = new ArrayList<Product>();
    private int idOrder;
 
    public static int nextID = 1;
 
    public Order(Client client) {
        this.client = client;
        this.idOrder = nextID;
        nextID = nextID + 1;
    }
 
    public Client getClient() {
        return client;
    }
 
    public void addProduct(Product product) {
        pruductOrder.add(product);
    }
 
    public int getSumOrder() {
        int s = 0;
        for (Product p : pruductOrder) {
            s = s + p.getCost();
        }
        return s;
    }
 
    public int getAvOrder() {
        int s = 0;
        int i = 0;
        for (Product p : pruductOrder) {
            s = s + p.getCost();
            i = i + 1;
        }
        return (int) s / i;
    }
 
    public int getIdOrder() {
        return idOrder;
    }
 
    @Override
    public String toString() {
        return "Order{" +
                "client=" + client +
                ", pruductOrder=" + pruductOrder +
                ", idOrder=" + idOrder +
                '}';
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package com.company;
 
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
 
public class OrderList {
 
    List<Order> ordersList = new ArrayList<Order>();
 
    public void addOrder(Order order) {
        ordersList.add(order);
    }
 
    public void delOrder(Order order) {
        ordersList.remove(order);
 
    }
 
    public void ordersShow() {
        for (Order o : ordersList) {
            System.out.println(o.toString());
        }
    }
 
    public Order getIdOrder(int id) {
        Order order = null;
        for (Order o : ordersList) {
            if (o.getIdOrder() == id) {
                order = o;
                break;
            }
 
        }
        return order;
    }
 
    public void saveOrders() throws FileNotFoundException, IOException {
        int q;
        do {
            Scanner scanner = new Scanner(System.in);
            System.out.println("1 - Save as text  2 - Save as bytecode  3 - Exit");
            q = scanner.nextInt();
            switch (q) {
                case 1:
                    for (Order Pr : ordersList) {
                        BufferedWriter bw = new BufferedWriter(new FileWriter("C:\\Users\\AL\\Desktop\\3 - Заказы в кафе\\orderstext.txt", true));
 
                        bw.write(Pr + "\r\n");
 
                        bw.close();
                    }
 
                    break;
                case 2:
                    try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("C:\\Users\\AL\\Desktop\\3 - Заказы в кафе\\ordersbyte.txt"))) {
                        //сериализация объекта делается вызовом метода writeObject() класса ObjectOutputStream
                        //Класс FileOutputStream предназначен для записи байтов в файл
                        oos.writeObject(ordersList);
 
                    } catch (Exception ex) {
                        System.out.println(ex.getMessage()); //getMessage() — получить сообщение об ошибке
                    }
 
                    break;
            }
        }
        while (q != 3);
    }
 
    public void loadOrders() throws FileNotFoundException, IOException {
        int q;
        do {
            Scanner scanner = new Scanner(System.in);
            System.out.println("1 - Load from text  2 - load from bytecode  3 - Exit");
            q = scanner.nextInt();
            switch (q) {
                case 1:
 
                    try {
                        Scanner in = new Scanner(new File("C:\\Users\\AL\\Desktop\\3 - Заказы в кафе\\orderstext.txt"));
                        StringBuffer data = new StringBuffer();
                        while (in.hasNext())
                            data.append(in.nextLine()).append("\n");
                        System.out.println(data.toString());
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
 
                    break;
                case 2:
                    List<Order> orders = null;
 
                    try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("C:\\Users\\AL\\Desktop\\3 - Заказы в кафе\\ordersbyte.txt"))) {
                        orders = (List<Order>) ois.readObject();
                        //readObject() может прочитать любой сериализованный объект, поэтому необходимо полученный объект приводить к конкретному типу.
                    } catch (Exception ex) {
 
                        System.out.println(ex.getMessage());
                    }
 
                    for (Order f : orders) {
                        System.out.printf(f.toString() + "\r\n");
                    }
 
                    break;
            }
        }
        while (q != 3);
    }
 
}
0
85 / 67 / 25
Регистрация: 09.10.2017
Сообщений: 208
05.02.2018, 10:12
Здравствуйте!

Так же, как BufferedWriter закрываете
bw.close();

надо закрывать и ObjectOutputStream и ObjectInputStream
oos.close();
ois.close();
0
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
05.02.2018, 10:19
TinSemenova, не надо. Они у него по механизму try-with-resources работают. Закроются сами.
1
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,242
06.02.2018, 16:42
Цитата Сообщение от HighPredator Посмотреть сообщение
TinSemenova, не надо. Они у него по механизму try-with-resources работают. Закроются сами.
нет, не закроются) если в try-with-resource инициализируем объект оператором new, при этом не создавая ссылку на объект, то такой ресурс закрыт не будет
0
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
06.02.2018, 16:49
Цитата Сообщение от Fene4ka_ Посмотреть сообщение
если в try-with-resource инициализируем объект оператором new, при этом не создавая ссылку на объект, то такой ресурс закрыт не будет
Что-то я вас вообще не понял. Переформулируйте пожалуйста.
0
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,242
06.02.2018, 17:21
Цитата Сообщение от HighPredator Посмотреть сообщение
Что-то я вас вообще не понял. Переформулируйте пожалуйста.
correct idiom
2
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
07.02.2018, 10:13
Fene4ka_, стоп, вы похоже неточно выразились. Мой ответ
Цитата Сообщение от HighPredator Посмотреть сообщение
не надо. Они у него по механизму try-with-resources работают. Закроются сами
был на тезис
Цитата Сообщение от TinSemenova Посмотреть сообщение
надо закрывать и ObjectOutputStream и ObjectInputStream
oos.close();
ois.close();
которые у человека в коде выглядят так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("C:\\Users\\AL\\Desktop\\3 - Заказы в кафе\\ordersbyte.txt"))) {
  //сериализация объекта делается вызовом метода writeObject() класса ObjectOutputStream
  //Класс FileOutputStream предназначен для записи байтов в файл
  oos.writeObject(ordersList); 
} catch (Exception ex) {
  System.out.println(ex.getMessage()); //getMessage() — получить сообщение об ошибке
}
 
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("C:\\Users\\AL\\Desktop\\3 - Заказы в кафе\\ordersbyte.txt"))) {
  orders = (List<Order>) ois.readObject();
  //readObject() может прочитать любой сериализованный объект, поэтому необходимо полученный объект приводить к конкретному типу.
} catch (Exception ex) { 
  System.out.println(ex.getMessage());
}
Так что тут я прав абсолютно ибо закрытие ois и oos будет иметь место. А вот чего не будет, так это закрытия зачейненых файловых стримов, которые тоже автоклозабл. Это не совсем то, на что я отвечал. Бесспорно вы правы, но говорили мы о разном, поэтому друг друга не поняли.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.02.2018, 10:13
Помогаю со студенческими работами здесь

Нужно сделать в запросе условие отбора по ФИО заказчика, при котором бы отображались все заказы по этому заказчику, или заказы всех заказчиков
SELECT Заказы.ФИО, Заказчики.ВУЗ, Заказы., Заказы.Стоимость, Заказы.примечание FROM Заказчики INNER JOIN Заказы ON Заказчики.ФиО =...

Задача. Распределить заказы между предприятиями так, чтобы надежность собираемых из них устройств была наибольшей
Радиотехническое устройство состоит из m блоков. Надежность устройства (время наработки на отказ) определяется наименее надежным блоком....

Кафе
http://***********/F/s48.***********/i119/1006/e1/bd4335fdad72.jpg.html составить программку по этому дизайну, цены сэндвич=50р картошка=40р...

Кафе-2
Задача по питону Саша открыла кофейню. Там продаются различные напитки в трех размерах — маленькие, средние и большие. Цены на эти...

Кафе
Помогите, пожалуйста, решить задачу Саша открыла кофейню. Там продают капучино, латте и раф маленького, среднего и большого размера....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru