1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.math.stat.descriptive;
18
19 import java.io.Serializable;
20 import java.util.ArrayList;
21 import java.util.List;
22
23 import org.apache.commons.math.MathException;
24 import org.apache.commons.math.stat.descriptive.UnivariateStatistic;
25 import org.apache.commons.math.stat.descriptive.DescriptiveStatistics;
26 import org.apache.commons.math.util.DefaultTransformer;
27 import org.apache.commons.math.util.NumberTransformer;
28
29
30
31
32 public class ListUnivariateImpl extends DescriptiveStatistics implements Serializable {
33
34
35 private static final long serialVersionUID = -8837442489133392138L;
36
37
38
39
40
41 protected List<Object> list;
42
43
44 protected NumberTransformer transformer;
45
46
47
48
49 public ListUnivariateImpl(){
50 this(new ArrayList<Object>());
51 }
52
53
54
55
56
57 public ListUnivariateImpl(List<Object> list) {
58 this(list, new DefaultTransformer());
59 }
60
61
62
63
64
65
66 public ListUnivariateImpl(List<Object> list, NumberTransformer transformer) {
67 super();
68 this.list = list;
69 this.transformer = transformer;
70 }
71
72
73 @Override
74 public double[] getValues() {
75
76 int length = list.size();
77
78
79
80
81
82
83 if (windowSize != DescriptiveStatistics.INFINITE_WINDOW &&
84 windowSize < list.size())
85 {
86 length = list.size() - Math.max(0, list.size() - windowSize);
87 }
88
89
90 double[] copiedArray = new double[length];
91
92 for (int i = 0; i < copiedArray.length; i++) {
93 copiedArray[i] = getElement(i);
94 }
95 return copiedArray;
96 }
97
98
99 @Override
100 public double getElement(int index) {
101
102 double value = Double.NaN;
103
104 int calcIndex = index;
105
106 if (windowSize != DescriptiveStatistics.INFINITE_WINDOW &&
107 windowSize < list.size())
108 {
109 calcIndex = (list.size() - windowSize) + index;
110 }
111
112
113 try {
114 value = transformer.transform(list.get(calcIndex));
115 } catch (MathException e) {
116 e.printStackTrace();
117 }
118
119 return value;
120 }
121
122
123 @Override
124 public long getN() {
125 int n = 0;
126
127 if (windowSize != DescriptiveStatistics.INFINITE_WINDOW) {
128 if (list.size() > windowSize) {
129 n = windowSize;
130 } else {
131 n = list.size();
132 }
133 } else {
134 n = list.size();
135 }
136 return n;
137 }
138
139
140 @Override
141 public void addValue(double v) {
142 list.add(Double.valueOf(v));
143 }
144
145
146
147
148
149 public void addObject(Object o) {
150 list.add(o);
151 }
152
153
154
155
156
157
158 @Override
159 public void clear() {
160 list.clear();
161 }
162
163
164
165
166
167
168 @Override
169 public double apply(UnivariateStatistic stat) {
170 double[] v = this.getValues();
171
172 if (v != null) {
173 return stat.evaluate(v, 0, v.length);
174 }
175 return Double.NaN;
176 }
177
178
179
180
181
182 public NumberTransformer getTransformer() {
183 return transformer;
184 }
185
186
187
188
189
190 public void setTransformer(NumberTransformer transformer) {
191 this.transformer = transformer;
192 }
193
194
195 @Override
196 public synchronized void setWindowSize(int windowSize) {
197 this.windowSize = windowSize;
198
199
200 int extra = list.size() - windowSize;
201 for (int i = 0; i < extra; i++) {
202 list.remove(0);
203 }
204 }
205
206
207 @Override
208 public synchronized int getWindowSize() {
209 return windowSize;
210 }
211
212 }