-
Notifications
You must be signed in to change notification settings - Fork 0
/
FieldStats.java
123 lines (110 loc) · 3.33 KB
/
FieldStats.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
import java.util.HashMap;
/**
* This class collects and provides some statistical data on the state
* of a field. It is flexible: it will create and maintain a counter
* for any class of object that is found within the field.
*
* @author Rayan Popat (K21056367) & James Coward (K22004743)
* @version 2023.02.23
*/
public class FieldStats {
// Counters for each type of life in the simulation.
private HashMap<Class<?>, Counter> counters;
// Whether the counters are currently up to date.
private boolean countsValid;
/**
* Construct a FieldStats object. Set up a collection for counters for
* each type of cell that we might find
*/
public FieldStats() {
counters = new HashMap<>();
countsValid = true;
}
/**
* Get details of what is in the field.
*
* @return A string describing what is in the field.
*/
public String getPopulationDetails(Field field) {
StringBuffer buffer = new StringBuffer();
if (!countsValid) {
generateCounts(field);
}
for (Class<?> key : counters.keySet()) {
Counter info = counters.get(key);
buffer.append(info.getName());
buffer.append(": ");
buffer.append(info.getCount());
buffer.append(' ');
}
return buffer.toString();
}
/**
* Invalidate the current set of statistics; reset all
* counts to zero.
*/
public void reset() {
countsValid = false;
for (Class<?> key : counters.keySet()) {
Counter count = counters.get(key);
count.reset();
}
}
/**
* Increment the count for one class of life
*
* @param cellClass The class of cell to increment.
*/
public void incrementCount(Class<?> cellClass) {
Counter count = counters.get(cellClass);
if (count == null) {
// We do not have a counter for this species yet. Create one.
count = new Counter(cellClass.getName());
counters.put(cellClass, count);
}
count.increment();
}
/**
* Indicate that a cell count has been completed.
*/
public void countFinished() {
countsValid = true;
}
/**
* Determine whether the simulation is still viable.
* I.e., should it continue to run.
*
* @return true If there is more than one life form alive
*/
public boolean isViable(Field field) {
int nonZero = 0;
if (!countsValid) {
generateCounts(field);
}
for (Class<?> key : counters.keySet()) {
Counter info = counters.get(key);
if (info.getCount() > 0) {
nonZero++;
}
}
return nonZero >= 1;
}
/**
* Generate counts of the number of cells.
* These are not kept up to date.
*
* @param field The field to generate the stats for.
*/
private void generateCounts(Field field) {
reset();
for (int row = 0; row < field.getDepth(); row++) {
for (int col = 0; col < field.getWidth(); col++) {
Cell cell = field.getObjectAt(row, col);
if (cell != null) {
incrementCount(cell.getClass());
}
}
}
countsValid = true;
}
}