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
|
package bjc.esodata;
import java.util.AbstractList;
import java.util.ArrayList;
import java.util.List;
/**
* A list that has a default value that out-of-bounds accesses return.
*
* @author Ben Culkin
* @param <ValueType>
* The type of the values contained in the list.
*/
public class DefaultList<ValueType> extends AbstractList<ValueType> {
/*
* @NOTE 9/17/18
*
* A possible feature to add would be the ability to set a 'default
* index', so that the default value is 'whatever is at that list index'
*
* Of course, this would cause an exception if that index was out of
* bounds, but what are you going to do?
*/
private ValueType defVal;
private List<ValueType> backing;
/**
* Create a new DefaultList.
*/
public DefaultList() {
this(new ArrayList<>(), null);
}
/**
* Create a new DefaultList, with a set default value.
*
* @param defVal
* The default value for the list.
*/
public DefaultList(ValueType defVal) {
this(new ArrayList<>(), defVal);
}
/**
* Create a new DefaultList, with a specific backing list.
*
* @param backer
* The backing list to use.
*
*/
public DefaultList(List<ValueType> backer) {
this(backer, null);
}
/**
* Create a new DefaultList, with a set default value.
*
* @param backer
* The backing list to use.
*
* @param defVal
* The default value for the list.
*/
public DefaultList(List<ValueType> backer, ValueType defVal) {
this.defVal = defVal;
this.backing = backer;
}
/**
* Get the default value.
*
* @return The default value.
*/
public ValueType getDefault() {
return defVal;
}
/**
* Set the default value.
*
* @param defVal The default value.
*/
public void setDefault(ValueType defVal) {
this.defVal = defVal;
}
@Override
public ValueType get(int idx) {
if (idx < 0 || idx >= backing.size()) return defVal;
return backing.get(idx);
}
@Override
public int size() {
return backing.size();
}
@Override
public ValueType set(int idx, ValueType val) {
return backing.set(idx, val);
}
@Override
public void add(int idx, ValueType val) {
backing.add(idx, val);
}
@Override
public ValueType remove(int idx) {
return backing.remove(idx);
}
}
|