forked from next-step/java-baseball-precourse
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathCarService.java
More file actions
97 lines (85 loc) · 3.25 KB
/
CarService.java
File metadata and controls
97 lines (85 loc) · 3.25 KB
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
package domain;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class CarService {
private static final Integer CAR_NAME_LENGTH = 5;
private final List<Car> cars = new ArrayList<>();
private final NumberGenerator numberGenerator;
public CarService(NumberGenerator numberGenerator) {
this.numberGenerator = numberGenerator;
}
// public void addCars(String[] names) {
// for (String name : names) {
// validateCarName(name);
// cars.add(new Car(name));
// }
// }
public void addCars(List<String> names) {
validateCarNames(names);
for (String name : names) {
cars.add(new Car(name));
}
}
public Map<String, Integer> run() {
Map<String, Integer> roundResult = new HashMap<>();
for (Car car : cars) {
car.move(numberGenerator.generate());
roundResult.put(car.getName(), car.getDistance());
}
return roundResult;
}
public List<String> findWinner() {
Car winner = cars.stream()
.max(Comparator.comparingInt(Car::getDistance)).get();
return cars.stream()
.filter(car -> car.getDistance().equals(winner.getDistance()))
.map(Car::getName)
.collect(Collectors.toList());
}
/**
* validate
*/
private void validateCarNames(List<String> names) throws IllegalArgumentException {
validateCarNamesEmpty(names);
validateCarNamesLength(names);
validateCarNameDup(names);
}
private void validateCarNamesLength(List<String> names) throws IllegalArgumentException {
if (names.stream().anyMatch(name -> name.length() > CAR_NAME_LENGTH)) {
throw new IllegalArgumentException("자동차 이름이 너무 깁니다.");
}
}
private void validateCarNamesEmpty(List<String> names) throws IllegalArgumentException {
if (names.stream().anyMatch(String::isEmpty)) {
throw new IllegalArgumentException("자동차 이름이 공백입니다.");
}
}
private void validateCarNameDup(List<String> names) throws IllegalArgumentException {
if (names.stream().distinct().count() < names.size()) {
throw new IllegalArgumentException("자동차 이름이 중복 됩니다.");
}
}
// private void validateCarName(String name) throws IllegalArgumentException {
// validateCarNameLength(name);
// validateCarNameDup(name);
// }
//
// private void validateCarNameLength(String name) throws IllegalArgumentException {
// if (name.length() > CAR_NAME_LENGTH) {
// throw new IllegalArgumentException("자동차 이름이 너무 깁니다.");
// }
// if (name.isEmpty()) {
// throw new IllegalArgumentException("자동차 이름이 공백입니다.");
// }
// }
//
// private void validateCarNameDup(String name) throws IllegalArgumentException {
// if (cars.stream().anyMatch(car -> car.getName().equals(name))) {
// throw new IllegalArgumentException("자동차 이름이 중복 됩니다.");
// }
// }
}