propane 3.1.0.pre-java → 3.2.0-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. checksums.yaml +4 -4
  2. data/.mvn/wrapper/maven-wrapper.properties +1 -0
  3. data/CHANGELOG.md +1 -5
  4. data/README.md +23 -12
  5. data/Rakefile +23 -12
  6. data/lib/propane/helpers/version_error.rb +6 -0
  7. data/lib/propane/runner.rb +12 -0
  8. data/lib/propane/version.rb +1 -1
  9. data/library/slider/slider.rb +1 -1
  10. data/mvnw +234 -0
  11. data/mvnw.cmd +145 -0
  12. data/pom.xml +28 -27
  13. data/propane.gemspec +2 -2
  14. data/src/main/java/japplemenubar/JAppleMenuBar.java +41 -47
  15. data/src/main/java/monkstone/ColorUtil.java +1 -1
  16. data/src/main/java/monkstone/MathToolModule.java +12 -11
  17. data/src/main/java/monkstone/PropaneLibrary.java +9 -10
  18. data/src/main/java/monkstone/core/LibraryProxy.java +124 -113
  19. data/src/main/java/monkstone/fastmath/Deglut.java +86 -89
  20. data/src/main/java/monkstone/filechooser/Chooser.java +7 -13
  21. data/src/main/java/monkstone/noise/SimplexNoise.java +0 -1
  22. data/src/main/java/monkstone/slider/CustomHorizontalSlider.java +4 -4
  23. data/src/main/java/monkstone/slider/CustomVerticalSlider.java +1 -1
  24. data/src/main/java/monkstone/slider/SimpleHorizontalSlider.java +9 -9
  25. data/src/main/java/monkstone/slider/SimpleSlider.java +0 -9
  26. data/src/main/java/monkstone/slider/SimpleVerticalSlider.java +11 -13
  27. data/src/main/java/monkstone/slider/Slider.java +1 -1
  28. data/src/main/java/monkstone/slider/SliderBar.java +1 -1
  29. data/src/main/java/monkstone/slider/SliderGroup.java +1 -1
  30. data/src/main/java/monkstone/slider/WheelHandler.java +8 -9
  31. data/src/main/java/monkstone/vecmath/AppRender.java +2 -2
  32. data/src/main/java/monkstone/vecmath/ShapeRender.java +2 -2
  33. data/src/main/java/monkstone/vecmath/package-info.java +2 -2
  34. data/src/main/java/monkstone/vecmath/vec2/Vec2.java +2 -2
  35. data/src/main/java/monkstone/vecmath/vec3/Vec3.java +1 -1
  36. data/src/main/java/monkstone/videoevent/VideoInterface.java +11 -5
  37. data/src/main/java/monkstone/videoevent/package-info.java +2 -2
  38. data/src/main/java/processing/awt/PGraphicsJava2D.java +1742 -2243
  39. data/src/main/java/processing/awt/PShapeJava2D.java +268 -270
  40. data/src/main/java/processing/awt/PSurfaceAWT.java +821 -920
  41. data/src/main/java/processing/core/DesktopHandler.java +94 -0
  42. data/src/main/java/processing/core/PApplet.java +14170 -14082
  43. data/src/main/java/processing/core/PConstants.java +447 -473
  44. data/src/main/java/processing/core/PFont.java +867 -873
  45. data/src/main/java/processing/core/PGraphics.java +7193 -7428
  46. data/src/main/java/processing/core/PImage.java +3051 -3117
  47. data/src/main/java/processing/core/PMatrix.java +159 -172
  48. data/src/main/java/processing/core/PMatrix2D.java +403 -444
  49. data/src/main/java/processing/core/PMatrix3D.java +735 -749
  50. data/src/main/java/processing/core/PShape.java +2651 -2793
  51. data/src/main/java/processing/core/PShapeOBJ.java +415 -422
  52. data/src/main/java/processing/core/PShapeSVG.java +1466 -1475
  53. data/src/main/java/processing/core/PStyle.java +37 -40
  54. data/src/main/java/processing/core/PSurface.java +98 -103
  55. data/src/main/java/processing/core/PSurfaceNone.java +208 -236
  56. data/src/main/java/processing/core/PVector.java +961 -990
  57. data/src/main/java/processing/data/DoubleDict.java +709 -753
  58. data/src/main/java/processing/data/DoubleList.java +695 -748
  59. data/src/main/java/processing/data/FloatDict.java +702 -746
  60. data/src/main/java/processing/data/FloatList.java +697 -751
  61. data/src/main/java/processing/data/IntDict.java +673 -718
  62. data/src/main/java/processing/data/IntList.java +633 -699
  63. data/src/main/java/processing/data/JSONArray.java +873 -931
  64. data/src/main/java/processing/data/JSONObject.java +1165 -1262
  65. data/src/main/java/processing/data/JSONTokener.java +341 -351
  66. data/src/main/java/processing/data/LongDict.java +662 -707
  67. data/src/main/java/processing/data/LongList.java +634 -700
  68. data/src/main/java/processing/data/Sort.java +41 -37
  69. data/src/main/java/processing/data/StringDict.java +486 -522
  70. data/src/main/java/processing/data/StringList.java +580 -624
  71. data/src/main/java/processing/data/Table.java +3508 -3686
  72. data/src/main/java/processing/data/TableRow.java +183 -182
  73. data/src/main/java/processing/data/XML.java +883 -957
  74. data/src/main/java/processing/event/Event.java +66 -87
  75. data/src/main/java/processing/event/KeyEvent.java +41 -48
  76. data/src/main/java/processing/event/MouseEvent.java +93 -103
  77. data/src/main/java/processing/event/TouchEvent.java +6 -10
  78. data/src/main/java/processing/javafx/PGraphicsFX2D.java +5 -69
  79. data/src/main/java/processing/javafx/PSurfaceFX.java +2 -7
  80. data/src/main/java/processing/opengl/FontTexture.java +270 -290
  81. data/src/main/java/processing/opengl/FrameBuffer.java +363 -375
  82. data/src/main/java/processing/opengl/LinePath.java +500 -543
  83. data/src/main/java/processing/opengl/LineStroker.java +582 -593
  84. data/src/main/java/processing/opengl/PGL.java +2881 -2904
  85. data/src/main/java/processing/opengl/PGraphics2D.java +315 -408
  86. data/src/main/java/processing/opengl/PGraphics3D.java +72 -107
  87. data/src/main/java/processing/opengl/PGraphicsOpenGL.java +12043 -12230
  88. data/src/main/java/processing/opengl/PJOGL.java +1681 -1745
  89. data/src/main/java/processing/opengl/PShader.java +1257 -1260
  90. data/src/main/java/processing/opengl/PShapeOpenGL.java +4599 -4662
  91. data/src/main/java/processing/opengl/PSurfaceJOGL.java +1030 -1047
  92. data/src/main/java/processing/opengl/Texture.java +1397 -1462
  93. data/src/main/java/processing/opengl/VertexBuffer.java +55 -57
  94. data/src/main/resources/icon/icon-1024.png +0 -0
  95. data/src/main/resources/icon/icon-128.png +0 -0
  96. data/src/main/resources/icon/icon-16.png +0 -0
  97. data/src/main/resources/icon/icon-256.png +0 -0
  98. data/src/main/resources/icon/icon-32.png +0 -0
  99. data/src/main/resources/icon/icon-48.png +0 -0
  100. data/src/main/resources/icon/icon-512.png +0 -0
  101. data/src/main/resources/icon/icon-64.png +0 -0
  102. data/vendors/Rakefile +1 -1
  103. metadata +12 -8
  104. data/src/main/java/processing/core/ThinkDifferent.java +0 -70
@@ -6,7 +6,6 @@ import java.util.Iterator;
6
6
 
7
7
  import processing.core.PApplet;
8
8
 
9
-
10
9
  /**
11
10
  * A simple class to use a String as a lookup for an int value.
12
11
  *
@@ -16,790 +15,746 @@ import processing.core.PApplet;
16
15
  */
17
16
  public class IntDict {
18
17
 
19
- /** Number of elements in the table */
20
- protected int count;
21
-
22
- protected String[] keys;
23
- protected int[] values;
24
-
25
- /** Internal implementation for faster lookups */
26
- private HashMap<String, Integer> indices = new HashMap<>();
27
-
28
-
29
- public IntDict() {
30
- count = 0;
31
- keys = new String[10];
32
- values = new int[10];
33
- }
34
-
35
-
36
- /**
37
- * Create a new lookup with a specific size. This is more efficient than not
38
- * specifying a size. Use it when you know the rough size of the thing you're creating.
39
- *
40
- * @nowebref
41
- */
42
- public IntDict(int length) {
43
- count = 0;
44
- keys = new String[length];
45
- values = new int[length];
46
- }
47
-
48
-
49
- /**
50
- * Read a set of entries from a Reader that has each key/value pair on
51
- * a single line, separated by a tab.
52
- *
53
- * @nowebref
54
- */
55
- public IntDict(BufferedReader reader) {
56
- String[] lines = PApplet.loadStrings(reader);
57
- keys = new String[lines.length];
58
- values = new int[lines.length];
59
-
60
- for (int i = 0; i < lines.length; i++) {
61
- String[] pieces = PApplet.split(lines[i], '\t');
62
- if (pieces.length == 2) {
63
- keys[count] = pieces[0];
64
- values[count] = PApplet.parseInt(pieces[1]);
65
- indices.put(pieces[0], count);
66
- count++;
67
- }
68
- }
69
- }
70
-
71
- /**
72
- * @nowebref
73
- */
74
- public IntDict(String[] keys, int[] values) {
75
- if (keys.length != values.length) {
76
- throw new IllegalArgumentException("key and value arrays must be the same length");
18
+ /**
19
+ * Number of elements in the table
20
+ */
21
+ protected int count;
22
+
23
+ protected String[] keys;
24
+ protected int[] values;
25
+
26
+ /**
27
+ * Internal implementation for faster lookups
28
+ */
29
+ private HashMap<String, Integer> indices = new HashMap<>();
30
+
31
+ public IntDict() {
32
+ count = 0;
33
+ keys = new String[10];
34
+ values = new int[10];
35
+ }
36
+
37
+ /**
38
+ * Create a new lookup with a specific size. This is more efficient than not
39
+ * specifying a size. Use it when you know the rough size of the thing
40
+ * you're creating.
41
+ *
42
+ * @nowebref
43
+ */
44
+ public IntDict(int length) {
45
+ count = 0;
46
+ keys = new String[length];
47
+ values = new int[length];
48
+ }
49
+
50
+ /**
51
+ * Read a set of entries from a Reader that has each key/value pair on a
52
+ * single line, separated by a tab.
53
+ *
54
+ * @nowebref
55
+ */
56
+ public IntDict(BufferedReader reader) {
57
+ String[] lines = PApplet.loadStrings(reader);
58
+ keys = new String[lines.length];
59
+ values = new int[lines.length];
60
+
61
+ for (int i = 0; i < lines.length; i++) {
62
+ String[] pieces = PApplet.split(lines[i], '\t');
63
+ if (pieces.length == 2) {
64
+ keys[count] = pieces[0];
65
+ values[count] = PApplet.parseInt(pieces[1]);
66
+ indices.put(pieces[0], count);
67
+ count++;
68
+ }
69
+ }
77
70
  }
78
- this.keys = keys;
79
- this.values = values;
80
- count = keys.length;
81
- for (int i = 0; i < count; i++) {
82
- indices.put(keys[i], i);
83
- }
84
- }
85
-
86
-
87
- /**
88
- * Constructor to allow (more intuitive) inline initialization, e.g.:
89
- * <pre>
90
- * new FloatDict(new Object[][] {
91
- * { "key1", 1 },
92
- * { "key2", 2 }
93
- * });
94
- * </pre>
95
- */
96
- public IntDict(Object[][] pairs) {
97
- count = pairs.length;
98
- this.keys = new String[count];
99
- this.values = new int[count];
100
- for (int i = 0; i < count; i++) {
101
- keys[i] = (String) pairs[i][0];
102
- values[i] = (Integer) pairs[i][1];
103
- indices.put(keys[i], i);
104
- }
105
- }
106
-
107
-
108
- /**
109
- * Returns the number of key/value pairs
110
- *
111
- * @webref intdict:method
112
- * @brief Returns the number of key/value pairs
113
- */
114
- public int size() {
115
- return count;
116
- }
117
71
 
118
-
119
- /**
120
- * Resize the internal data, this can only be used to shrink the list.
121
- * Helpful for situations like sorting and then grabbing the top 50 entries.
122
- */
123
- public void resize(int length) {
124
- if (length > count) {
125
- throw new IllegalArgumentException("resize() can only be used to shrink the dictionary");
126
- }
127
- if (length < 1) {
128
- throw new IllegalArgumentException("resize(" + length + ") is too small, use 1 or higher");
72
+ /**
73
+ * @nowebref
74
+ */
75
+ public IntDict(String[] keys, int[] values) {
76
+ if (keys.length != values.length) {
77
+ throw new IllegalArgumentException("key and value arrays must be the same length");
78
+ }
79
+ this.keys = keys;
80
+ this.values = values;
81
+ count = keys.length;
82
+ for (int i = 0; i < count; i++) {
83
+ indices.put(keys[i], i);
84
+ }
129
85
  }
130
86
 
131
- String[] newKeys = new String[length];
132
- int[] newValues = new int[length];
133
- PApplet.arrayCopy(keys, newKeys, length);
134
- PApplet.arrayCopy(values, newValues, length);
135
- keys = newKeys;
136
- values = newValues;
137
- count = length;
138
- resetIndices();
139
- }
140
-
141
-
142
- /**
143
- * Remove all entries.
144
- *
145
- * @webref intdict:method
146
- * @brief Remove all entries
147
- */
148
- public void clear() {
149
- count = 0;
150
- indices = new HashMap<>();
151
- }
152
-
153
-
154
- private void resetIndices() {
155
- indices = new HashMap<>(count);
156
- for (int i = 0; i < count; i++) {
157
- indices.put(keys[i], i);
87
+ /**
88
+ * Constructor to allow (more intuitive) inline initialization, e.g.:
89
+ * <pre>
90
+ * new FloatDict(new Object[][] {
91
+ * { "key1", 1 },
92
+ * { "key2", 2 }
93
+ * });
94
+ * </pre>
95
+ */
96
+ public IntDict(Object[][] pairs) {
97
+ count = pairs.length;
98
+ this.keys = new String[count];
99
+ this.values = new int[count];
100
+ for (int i = 0; i < count; i++) {
101
+ keys[i] = (String) pairs[i][0];
102
+ values[i] = (Integer) pairs[i][1];
103
+ indices.put(keys[i], i);
104
+ }
158
105
  }
159
- }
160
-
161
-
162
- // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
163
-
164
106
 
165
- public class Entry {
166
- public String key;
167
- public int value;
168
-
169
- Entry(String key, int value) {
170
- this.key = key;
171
- this.value = value;
107
+ /**
108
+ * Returns the number of key/value pairs
109
+ *
110
+ * @webref intdict:method
111
+ * @brief Returns the number of key/value pairs
112
+ */
113
+ public int size() {
114
+ return count;
172
115
  }
173
- }
174
-
175
-
176
- public Iterable<Entry> entries() {
177
- return new Iterable<Entry>() {
178
-
179
- public Iterator<Entry> iterator() {
180
- return entryIterator();
181
- }
182
- };
183
- }
184
-
185
116
 
186
- public Iterator<Entry> entryIterator() {
187
- return new Iterator<Entry>() {
188
- int index = -1;
189
-
190
- public void remove() {
191
- removeIndex(index);
192
- index--;
193
- }
194
-
195
- public Entry next() {
196
- ++index;
197
- Entry e = new Entry(keys[index], values[index]);
198
- return e;
199
- }
200
-
201
- public boolean hasNext() {
202
- return index+1 < size();
203
- }
204
- };
205
- }
117
+ /**
118
+ * Resize the internal data, this can only be used to shrink the list.
119
+ * Helpful for situations like sorting and then grabbing the top 50 entries.
120
+ */
121
+ public void resize(int length) {
122
+ if (length > count) {
123
+ throw new IllegalArgumentException("resize() can only be used to shrink the dictionary");
124
+ }
125
+ if (length < 1) {
126
+ throw new IllegalArgumentException("resize(" + length + ") is too small, use 1 or higher");
127
+ }
206
128
 
129
+ String[] newKeys = new String[length];
130
+ int[] newValues = new int[length];
131
+ PApplet.arrayCopy(keys, newKeys, length);
132
+ PApplet.arrayCopy(values, newValues, length);
133
+ keys = newKeys;
134
+ values = newValues;
135
+ count = length;
136
+ resetIndices();
137
+ }
138
+
139
+ /**
140
+ * Remove all entries.
141
+ *
142
+ * @webref intdict:method
143
+ * @brief Remove all entries
144
+ */
145
+ public void clear() {
146
+ count = 0;
147
+ indices = new HashMap<>();
148
+ }
149
+
150
+ private void resetIndices() {
151
+ indices = new HashMap<>(count);
152
+ for (int i = 0; i < count; i++) {
153
+ indices.put(keys[i], i);
154
+ }
155
+ }
207
156
 
208
- // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
157
+ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
158
+ public class Entry {
209
159
 
160
+ public String key;
161
+ public int value;
210
162
 
211
- public String key(int index) {
212
- return keys[index];
213
- }
163
+ Entry(String key, int value) {
164
+ this.key = key;
165
+ this.value = value;
166
+ }
167
+ }
214
168
 
169
+ public Iterable<Entry> entries() {
170
+ return new Iterable<Entry>() {
215
171
 
216
- protected void crop() {
217
- if (count != keys.length) {
218
- keys = PApplet.subset(keys, 0, count);
219
- values = PApplet.subset(values, 0, count);
172
+ public Iterator<Entry> iterator() {
173
+ return entryIterator();
174
+ }
175
+ };
220
176
  }
221
- }
222
177
 
178
+ public Iterator<Entry> entryIterator() {
179
+ return new Iterator<Entry>() {
180
+ int index = -1;
223
181
 
224
- public Iterable<String> keys() {
225
- return new Iterable<String>() {
182
+ public void remove() {
183
+ removeIndex(index);
184
+ index--;
185
+ }
226
186
 
227
- @Override
228
- public Iterator<String> iterator() {
229
- return keyIterator();
230
- }
231
- };
232
- }
187
+ public Entry next() {
188
+ ++index;
189
+ Entry e = new Entry(keys[index], values[index]);
190
+ return e;
191
+ }
233
192
 
193
+ public boolean hasNext() {
194
+ return index + 1 < size();
195
+ }
196
+ };
197
+ }
234
198
 
235
- // Use this to iterate when you want to be able to remove elements along the way
236
- public Iterator<String> keyIterator() {
237
- return new Iterator<String>() {
238
- int index = -1;
199
+ // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
200
+ public String key(int index) {
201
+ return keys[index];
202
+ }
239
203
 
240
- public void remove() {
241
- removeIndex(index);
242
- index--;
243
- }
204
+ protected void crop() {
205
+ if (count != keys.length) {
206
+ keys = PApplet.subset(keys, 0, count);
207
+ values = PApplet.subset(values, 0, count);
208
+ }
209
+ }
244
210
 
245
- public String next() {
246
- return key(++index);
247
- }
211
+ public Iterable<String> keys() {
212
+ return new Iterable<String>() {
248
213
 
249
- public boolean hasNext() {
250
- return index+1 < size();
251
- }
252
- };
253
- }
214
+ @Override
215
+ public Iterator<String> iterator() {
216
+ return keyIterator();
217
+ }
218
+ };
219
+ }
254
220
 
221
+ // Use this to iterate when you want to be able to remove elements along the way
222
+ public Iterator<String> keyIterator() {
223
+ return new Iterator<String>() {
224
+ int index = -1;
255
225
 
256
- /**
257
- * Return a copy of the internal keys array. This array can be modified.
258
- *
259
- * @webref intdict:method
260
- * @brief Return a copy of the internal keys array
261
- */
262
- public String[] keyArray() {
263
- crop();
264
- return keyArray(null);
265
- }
226
+ public void remove() {
227
+ removeIndex(index);
228
+ index--;
229
+ }
266
230
 
231
+ public String next() {
232
+ return key(++index);
233
+ }
267
234
 
268
- public String[] keyArray(String[] outgoing) {
269
- if (outgoing == null || outgoing.length != count) {
270
- outgoing = new String[count];
235
+ public boolean hasNext() {
236
+ return index + 1 < size();
237
+ }
238
+ };
271
239
  }
272
- System.arraycopy(keys, 0, outgoing, 0, count);
273
- return outgoing;
274
- }
275
-
276
-
277
- public int value(int index) {
278
- return values[index];
279
- }
280
-
281
-
282
- /**
283
- * @webref intdict:method
284
- * @brief Return the internal array being used to store the values
285
- */
286
- public Iterable<Integer> values() {
287
- return new Iterable<Integer>() {
288
-
289
- @Override
290
- public Iterator<Integer> iterator() {
291
- return valueIterator();
292
- }
293
- };
294
- }
295
-
296
-
297
- public Iterator<Integer> valueIterator() {
298
- return new Iterator<Integer>() {
299
- int index = -1;
300
-
301
- public void remove() {
302
- removeIndex(index);
303
- index--;
304
- }
305
240
 
306
- public Integer next() {
307
- return value(++index);
308
- }
309
-
310
- public boolean hasNext() {
311
- return index+1 < size();
312
- }
313
- };
314
- }
315
-
316
-
317
- /**
318
- * Create a new array and copy each of the values into it.
319
- *
320
- * @webref intdict:method
321
- * @brief Create a new array and copy each of the values into it
322
- */
323
- public int[] valueArray() {
324
- crop();
325
- return valueArray(null);
326
- }
327
-
328
-
329
- /**
330
- * Fill an already-allocated array with the values (more efficient than
331
- * creating a new array each time). If 'array' is null, or not the same
332
- * size as the number of values, a new array will be allocated and returned.
333
- *
334
- * @param array values to copy into the array
335
- */
336
- public int[] valueArray(int[] array) {
337
- if (array == null || array.length != size()) {
338
- array = new int[count];
339
- }
340
- System.arraycopy(values, 0, array, 0, count);
341
- return array;
342
- }
343
-
344
-
345
- /**
346
- * Return a value for the specified key.
347
- *
348
- * @webref intdict:method
349
- * @brief Return a value for the specified key
350
- */
351
- public int get(String key) {
352
- int index = index(key);
353
- if (index == -1) {
354
- throw new IllegalArgumentException("No key named '" + key + "'");
355
- }
356
- return values[index];
357
- }
358
-
359
-
360
- public int get(String key, int alternate) {
361
- int index = index(key);
362
- if (index == -1) return alternate;
363
- return values[index];
364
- }
365
-
366
-
367
- /**
368
- * Create a new key/value pair or change the value of one.
369
- *
370
- * @webref intdict:method
371
- * @brief Create a new key/value pair or change the value of one
372
- */
373
- public void set(String key, int amount) {
374
- int index = index(key);
375
- if (index == -1) {
376
- create(key, amount);
377
- } else {
378
- values[index] = amount;
379
- }
380
- }
381
-
382
-
383
- public void setIndex(int index, String key, int value) {
384
- if (index < 0 || index >= count) {
385
- throw new ArrayIndexOutOfBoundsException(index);
386
- }
387
- keys[index] = key;
388
- values[index] = value;
389
- }
390
-
391
-
392
- /**
393
- * @webref intdict:method
394
- * @brief Check if a key is a part of the data structure
395
- */
396
- public boolean hasKey(String key) {
397
- return index(key) != -1;
398
- }
399
-
400
-
401
- /**
402
- * Increase the value associated with a specific key by 1.
403
- *
404
- * @webref intdict:method
405
- * @brief Increase the value of a specific key value by 1
406
- */
407
- public void increment(String key) {
408
- add(key, 1);
409
- }
410
-
411
-
412
- /**
413
- * Merge another dictionary into this one. Calling this increment()
414
- * since it doesn't make sense in practice for the other dictionary types,
415
- * even though it's technically an add().
416
- */
417
- public void increment(IntDict dict) {
418
- for (int i = 0; i < dict.count; i++) {
419
- add(dict.key(i), dict.value(i));
420
- }
421
- }
422
-
423
-
424
- /**
425
- * @webref intdict:method
426
- * @brief Add to a value
427
- */
428
- public void add(String key, int amount) {
429
- int index = index(key);
430
- if (index == -1) {
431
- create(key, amount);
432
- } else {
433
- values[index] += amount;
434
- }
435
- }
436
-
437
-
438
- /**
439
- * @webref intdict:method
440
- * @brief Subtract from a value
441
- */
442
- public void sub(String key, int amount) {
443
- add(key, -amount);
444
- }
445
-
446
-
447
- /**
448
- * @webref intdict:method
449
- * @brief Multiply a value
450
- */
451
- public void mult(String key, int amount) {
452
- int index = index(key);
453
- if (index != -1) {
454
- values[index] *= amount;
241
+ /**
242
+ * Return a copy of the internal keys array. This array can be modified.
243
+ *
244
+ * @webref intdict:method
245
+ * @brief Return a copy of the internal keys array
246
+ */
247
+ public String[] keyArray() {
248
+ crop();
249
+ return keyArray(null);
455
250
  }
456
- }
457
-
458
-
459
- /**
460
- * @webref intdict:method
461
- * @brief Divide a value
462
- */
463
- public void div(String key, int amount) {
464
- int index = index(key);
465
- if (index != -1) {
466
- values[index] /= amount;
467
- }
468
- }
469
-
470
251
 
471
- private void checkMinMax(String functionName) {
472
- if (count == 0) {
473
- String msg =
474
- String.format("Cannot use %s() on an empty %s.",
475
- functionName, getClass().getSimpleName());
476
- throw new RuntimeException(msg);
252
+ public String[] keyArray(String[] outgoing) {
253
+ if (outgoing == null || outgoing.length != count) {
254
+ outgoing = new String[count];
255
+ }
256
+ System.arraycopy(keys, 0, outgoing, 0, count);
257
+ return outgoing;
258
+ }
259
+
260
+ public int value(int index) {
261
+ return values[index];
262
+ }
263
+
264
+ /**
265
+ * @webref intdict:method
266
+ * @brief Return the internal array being used to store the values
267
+ */
268
+ public Iterable<Integer> values() {
269
+ return new Iterable<Integer>() {
270
+
271
+ @Override
272
+ public Iterator<Integer> iterator() {
273
+ return valueIterator();
274
+ }
275
+ };
276
+ }
277
+
278
+ public Iterator<Integer> valueIterator() {
279
+ return new Iterator<Integer>() {
280
+ int index = -1;
281
+
282
+ public void remove() {
283
+ removeIndex(index);
284
+ index--;
285
+ }
286
+
287
+ public Integer next() {
288
+ return value(++index);
289
+ }
290
+
291
+ public boolean hasNext() {
292
+ return index + 1 < size();
293
+ }
294
+ };
295
+ }
296
+
297
+ /**
298
+ * Create a new array and copy each of the values into it.
299
+ *
300
+ * @webref intdict:method
301
+ * @brief Create a new array and copy each of the values into it
302
+ */
303
+ public int[] valueArray() {
304
+ crop();
305
+ return valueArray(null);
306
+ }
307
+
308
+ /**
309
+ * Fill an already-allocated array with the values (more efficient than
310
+ * creating a new array each time). If 'array' is null, or not the same size
311
+ * as the number of values, a new array will be allocated and returned.
312
+ *
313
+ * @param array values to copy into the array
314
+ */
315
+ public int[] valueArray(int[] array) {
316
+ if (array == null || array.length != size()) {
317
+ array = new int[count];
318
+ }
319
+ System.arraycopy(values, 0, array, 0, count);
320
+ return array;
321
+ }
322
+
323
+ /**
324
+ * Return a value for the specified key.
325
+ *
326
+ * @webref intdict:method
327
+ * @brief Return a value for the specified key
328
+ */
329
+ public int get(String key) {
330
+ int index = index(key);
331
+ if (index == -1) {
332
+ throw new IllegalArgumentException("No key named '" + key + "'");
333
+ }
334
+ return values[index];
477
335
  }
478
- }
479
336
 
337
+ public int get(String key, int alternate) {
338
+ int index = index(key);
339
+ if (index == -1) {
340
+ return alternate;
341
+ }
342
+ return values[index];
343
+ }
344
+
345
+ /**
346
+ * Create a new key/value pair or change the value of one.
347
+ *
348
+ * @webref intdict:method
349
+ * @brief Create a new key/value pair or change the value of one
350
+ */
351
+ public void set(String key, int amount) {
352
+ int index = index(key);
353
+ if (index == -1) {
354
+ create(key, amount);
355
+ } else {
356
+ values[index] = amount;
357
+ }
358
+ }
480
359
 
481
- // return the index of the minimum value
482
- public int minIndex() {
483
- //checkMinMax("minIndex");
484
- if (count == 0) return -1;
360
+ public void setIndex(int index, String key, int value) {
361
+ if (index < 0 || index >= count) {
362
+ throw new ArrayIndexOutOfBoundsException(index);
363
+ }
364
+ keys[index] = key;
365
+ values[index] = value;
366
+ }
367
+
368
+ /**
369
+ * @webref intdict:method
370
+ * @brief Check if a key is a part of the data structure
371
+ */
372
+ public boolean hasKey(String key) {
373
+ return index(key) != -1;
374
+ }
375
+
376
+ /**
377
+ * Increase the value associated with a specific key by 1.
378
+ *
379
+ * @webref intdict:method
380
+ * @brief Increase the value of a specific key value by 1
381
+ */
382
+ public void increment(String key) {
383
+ add(key, 1);
384
+ }
385
+
386
+ /**
387
+ * Merge another dictionary into this one. Calling this increment() since it
388
+ * doesn't make sense in practice for the other dictionary types, even
389
+ * though it's technically an add().
390
+ */
391
+ public void increment(IntDict dict) {
392
+ for (int i = 0; i < dict.count; i++) {
393
+ add(dict.key(i), dict.value(i));
394
+ }
395
+ }
485
396
 
486
- int index = 0;
487
- int value = values[0];
488
- for (int i = 1; i < count; i++) {
489
- if (values[i] < value) {
490
- index = i;
491
- value = values[i];
492
- }
397
+ /**
398
+ * @webref intdict:method
399
+ * @brief Add to a value
400
+ */
401
+ public void add(String key, int amount) {
402
+ int index = index(key);
403
+ if (index == -1) {
404
+ create(key, amount);
405
+ } else {
406
+ values[index] += amount;
407
+ }
493
408
  }
494
- return index;
495
- }
496
409
 
410
+ /**
411
+ * @webref intdict:method
412
+ * @brief Subtract from a value
413
+ */
414
+ public void sub(String key, int amount) {
415
+ add(key, -amount);
416
+ }
497
417
 
498
- // return the key for the minimum value
499
- public String minKey() {
500
- checkMinMax("minKey");
501
- int index = minIndex();
502
- if (index == -1) {
503
- return null;
418
+ /**
419
+ * @webref intdict:method
420
+ * @brief Multiply a value
421
+ */
422
+ public void mult(String key, int amount) {
423
+ int index = index(key);
424
+ if (index != -1) {
425
+ values[index] *= amount;
426
+ }
504
427
  }
505
- return keys[index];
506
- }
507
428
 
429
+ /**
430
+ * @webref intdict:method
431
+ * @brief Divide a value
432
+ */
433
+ public void div(String key, int amount) {
434
+ int index = index(key);
435
+ if (index != -1) {
436
+ values[index] /= amount;
437
+ }
438
+ }
508
439
 
509
- // return the minimum value, or throw an error if there are no values
510
- public int minValue() {
511
- checkMinMax("minValue");
512
- return values[minIndex()];
513
- }
440
+ private void checkMinMax(String functionName) {
441
+ if (count == 0) {
442
+ String msg
443
+ = String.format("Cannot use %s() on an empty %s.",
444
+ functionName, getClass().getSimpleName());
445
+ throw new RuntimeException(msg);
446
+ }
447
+ }
514
448
 
449
+ // return the index of the minimum value
450
+ public int minIndex() {
451
+ //checkMinMax("minIndex");
452
+ if (count == 0) {
453
+ return -1;
454
+ }
515
455
 
516
- // return the index of the max value
517
- public int maxIndex() {
518
- //checkMinMax("maxIndex");
519
- if (count == 0) {
520
- return -1;
521
- }
522
- int index = 0;
523
- int value = values[0];
524
- for (int i = 1; i < count; i++) {
525
- if (values[i] > value) {
526
- index = i;
527
- value = values[i];
528
- }
456
+ int index = 0;
457
+ int value = values[0];
458
+ for (int i = 1; i < count; i++) {
459
+ if (values[i] < value) {
460
+ index = i;
461
+ value = values[i];
462
+ }
463
+ }
464
+ return index;
529
465
  }
530
- return index;
531
- }
532
466
 
467
+ // return the key for the minimum value
468
+ public String minKey() {
469
+ checkMinMax("minKey");
470
+ int index = minIndex();
471
+ if (index == -1) {
472
+ return null;
473
+ }
474
+ return keys[index];
475
+ }
533
476
 
534
- /** return the key corresponding to the maximum value or null if no entries */
535
- public String maxKey() {
536
- //checkMinMax("maxKey");
537
- int index = maxIndex();
538
- if (index == -1) {
539
- return null;
477
+ // return the minimum value, or throw an error if there are no values
478
+ public int minValue() {
479
+ checkMinMax("minValue");
480
+ return values[minIndex()];
540
481
  }
541
- return keys[index];
542
- }
543
482
 
483
+ // return the index of the max value
484
+ public int maxIndex() {
485
+ //checkMinMax("maxIndex");
486
+ if (count == 0) {
487
+ return -1;
488
+ }
489
+ int index = 0;
490
+ int value = values[0];
491
+ for (int i = 1; i < count; i++) {
492
+ if (values[i] > value) {
493
+ index = i;
494
+ value = values[i];
495
+ }
496
+ }
497
+ return index;
498
+ }
544
499
 
545
- // return the maximum value or throw an error if zero length
546
- public int maxValue() {
547
- checkMinMax("maxIndex");
548
- return values[maxIndex()];
549
- }
500
+ /**
501
+ * return the key corresponding to the maximum value or null if no entries
502
+ */
503
+ public String maxKey() {
504
+ //checkMinMax("maxKey");
505
+ int index = maxIndex();
506
+ if (index == -1) {
507
+ return null;
508
+ }
509
+ return keys[index];
510
+ }
550
511
 
512
+ // return the maximum value or throw an error if zero length
513
+ public int maxValue() {
514
+ checkMinMax("maxIndex");
515
+ return values[maxIndex()];
516
+ }
551
517
 
552
- public int sum() {
553
- long amount = sumLong();
554
- if (amount > Integer.MAX_VALUE) {
555
- throw new RuntimeException("sum() exceeds " + Integer.MAX_VALUE + ", use sumLong()");
518
+ public int sum() {
519
+ long amount = sumLong();
520
+ if (amount > Integer.MAX_VALUE) {
521
+ throw new RuntimeException("sum() exceeds " + Integer.MAX_VALUE + ", use sumLong()");
522
+ }
523
+ if (amount < Integer.MIN_VALUE) {
524
+ throw new RuntimeException("sum() less than " + Integer.MIN_VALUE + ", use sumLong()");
525
+ }
526
+ return (int) amount;
556
527
  }
557
- if (amount < Integer.MIN_VALUE) {
558
- throw new RuntimeException("sum() less than " + Integer.MIN_VALUE + ", use sumLong()");
528
+
529
+ public long sumLong() {
530
+ long sum = 0;
531
+ for (int i = 0; i < count; i++) {
532
+ sum += values[i];
533
+ }
534
+ return sum;
559
535
  }
560
- return (int) amount;
561
- }
562
536
 
537
+ public int index(String what) {
538
+ Integer found = indices.get(what);
539
+ return (found == null) ? -1 : found.intValue();
540
+ }
563
541
 
564
- public long sumLong() {
565
- long sum = 0;
566
- for (int i = 0; i < count; i++) {
567
- sum += values[i];
542
+ protected void create(String what, int much) {
543
+ if (count == keys.length) {
544
+ keys = PApplet.expand(keys);
545
+ values = PApplet.expand(values);
546
+ }
547
+ indices.put(what, Integer.valueOf(count));
548
+ keys[count] = what;
549
+ values[count] = much;
550
+ count++;
568
551
  }
569
- return sum;
570
- }
571
552
 
553
+ /**
554
+ * @webref intdict:method
555
+ * @brief Remove a key/value pair
556
+ */
557
+ public int remove(String key) {
558
+ int index = index(key);
559
+ if (index != -1) {
560
+ removeIndex(index);
561
+ }
562
+ return index;
563
+ }
572
564
 
573
- public int index(String what) {
574
- Integer found = indices.get(what);
575
- return (found == null) ? -1 : found.intValue();
576
- }
565
+ public String removeIndex(int index) {
566
+ if (index < 0 || index >= count) {
567
+ throw new ArrayIndexOutOfBoundsException(index);
568
+ }
569
+ //System.out.println("index is " + which + " and " + keys[which]);
570
+ String key = keys[index];
571
+ indices.remove(keys[index]);
572
+ for (int i = index; i < count - 1; i++) {
573
+ keys[i] = keys[i + 1];
574
+ values[i] = values[i + 1];
575
+ indices.put(keys[i], i);
576
+ }
577
+ count--;
578
+ keys[count] = null;
579
+ values[count] = 0;
580
+ return key;
581
+ }
577
582
 
583
+ public void swap(int a, int b) {
584
+ String tkey = keys[a];
585
+ int tvalue = values[a];
586
+ keys[a] = keys[b];
587
+ values[a] = values[b];
588
+ keys[b] = tkey;
589
+ values[b] = tvalue;
578
590
 
579
- protected void create(String what, int much) {
580
- if (count == keys.length) {
581
- keys = PApplet.expand(keys);
582
- values = PApplet.expand(values);
591
+ // indices.put(keys[a], Integer.valueOf(a));
592
+ // indices.put(keys[b], Integer.valueOf(b));
583
593
  }
584
- indices.put(what, Integer.valueOf(count));
585
- keys[count] = what;
586
- values[count] = much;
587
- count++;
588
- }
589
594
 
590
- /**
591
- * @webref intdict:method
592
- * @brief Remove a key/value pair
593
- */
594
- public int remove(String key) {
595
- int index = index(key);
596
- if (index != -1) {
597
- removeIndex(index);
595
+ /**
596
+ * Sort the keys alphabetically (ignoring case). Uses the value as a
597
+ * tie-breaker (only really possible with a key that has a case change).
598
+ *
599
+ * @webref intdict:method
600
+ * @brief Sort the keys alphabetically
601
+ */
602
+ public void sortKeys() {
603
+ sortImpl(true, false, true);
604
+ }
605
+
606
+ /**
607
+ * Sort the keys alphabetically in reverse (ignoring case). Uses the value
608
+ * as a tie-breaker (only really possible with a key that has a case
609
+ * change).
610
+ *
611
+ * @webref intdict:method
612
+ * @brief Sort the keys alphabetically in reverse
613
+ */
614
+ public void sortKeysReverse() {
615
+ sortImpl(true, true, true);
616
+ }
617
+
618
+ /**
619
+ * Sort by values in ascending order. The smallest value will be at [0].
620
+ *
621
+ * @webref intdict:method
622
+ * @brief Sort by values in ascending order
623
+ */
624
+ public void sortValues() {
625
+ sortValues(true);
626
+ }
627
+
628
+ /**
629
+ * Set true to ensure that the order returned is identical. Slightly slower
630
+ * because the tie-breaker for identical values compares the keys.
631
+ *
632
+ * @param stable
633
+ */
634
+ public void sortValues(boolean stable) {
635
+ sortImpl(false, false, stable);
636
+ }
637
+
638
+ /**
639
+ * Sort by values in descending order. The largest value will be at [0].
640
+ *
641
+ * @webref intdict:method
642
+ * @brief Sort by values in descending order
643
+ */
644
+ public void sortValuesReverse() {
645
+ sortValuesReverse(true);
646
+ }
647
+
648
+ public void sortValuesReverse(boolean stable) {
649
+ sortImpl(false, true, stable);
650
+ }
651
+
652
+ protected void sortImpl(final boolean useKeys, final boolean reverse,
653
+ final boolean stable) {
654
+ Sort s = new Sort() {
655
+ @Override
656
+ public int size() {
657
+ return count;
658
+ }
659
+
660
+ @Override
661
+ public int compare(int a, int b) {
662
+ int diff = 0;
663
+ if (useKeys) {
664
+ diff = keys[a].compareToIgnoreCase(keys[b]);
665
+ if (diff == 0) {
666
+ diff = values[a] - values[b];
667
+ }
668
+ } else { // sort values
669
+ diff = values[a] - values[b];
670
+ if (diff == 0 && stable) {
671
+ diff = keys[a].compareToIgnoreCase(keys[b]);
672
+ }
673
+ }
674
+ return reverse ? -diff : diff;
675
+ }
676
+
677
+ @Override
678
+ public void swap(int a, int b) {
679
+ IntDict.this.swap(a, b);
680
+ }
681
+ };
682
+ s.run();
683
+
684
+ // Set the indices after sort/swaps (performance fix 160411)
685
+ resetIndices();
686
+ }
687
+
688
+ /**
689
+ * Sum all of the values in this dictionary, then return a new FloatDict of
690
+ * each key, divided by the total sum. The total for all values will be
691
+ * ~1.0.
692
+ *
693
+ * @return an IntDict with the original keys, mapped to their pct of the
694
+ * total
695
+ */
696
+ public FloatDict getPercent() {
697
+ double sum = sum(); // a little more accuracy
698
+ FloatDict outgoing = new FloatDict();
699
+ for (int i = 0; i < size(); i++) {
700
+ double percent = value(i) / sum;
701
+ outgoing.set(key(i), (float) percent);
702
+ }
703
+ return outgoing;
704
+ }
705
+
706
+ /**
707
+ * Returns a duplicate copy of this object.
708
+ */
709
+ public IntDict copy() {
710
+ IntDict outgoing = new IntDict(count);
711
+ System.arraycopy(keys, 0, outgoing.keys, 0, count);
712
+ System.arraycopy(values, 0, outgoing.values, 0, count);
713
+ for (int i = 0; i < count; i++) {
714
+ outgoing.indices.put(keys[i], i);
715
+ }
716
+ outgoing.count = count;
717
+ return outgoing;
598
718
  }
599
- return index;
600
- }
601
-
602
719
 
603
- public String removeIndex(int index) {
604
- if (index < 0 || index >= count) {
605
- throw new ArrayIndexOutOfBoundsException(index);
720
+ public void print() {
721
+ for (int i = 0; i < size(); i++) {
722
+ System.out.println(keys[i] + " = " + values[i]);
723
+ }
606
724
  }
607
- //System.out.println("index is " + which + " and " + keys[which]);
608
- String key = keys[index];
609
- indices.remove(keys[index]);
610
- for (int i = index; i < count-1; i++) {
611
- keys[i] = keys[i+1];
612
- values[i] = values[i+1];
613
- indices.put(keys[i], i);
725
+
726
+ /**
727
+ * Save tab-delimited entries to a file (TSV format, UTF-8 encoding)
728
+ */
729
+ public void save(File file) {
730
+ PrintWriter writer = PApplet.createWriter(file);
731
+ write(writer);
732
+ writer.close();
614
733
  }
615
- count--;
616
- keys[count] = null;
617
- values[count] = 0;
618
- return key;
619
- }
620
734
 
735
+ /**
736
+ * Write tab-delimited entries to a PrintWriter
737
+ */
738
+ public void write(PrintWriter writer) {
739
+ for (int i = 0; i < count; i++) {
740
+ writer.println(keys[i] + "\t" + values[i]);
741
+ }
742
+ writer.flush();
743
+ }
621
744
 
622
- public void swap(int a, int b) {
623
- String tkey = keys[a];
624
- int tvalue = values[a];
625
- keys[a] = keys[b];
626
- values[a] = values[b];
627
- keys[b] = tkey;
628
- values[b] = tvalue;
745
+ /**
746
+ * Return this dictionary as a String in JSON format.
747
+ */
748
+ public String toJSON() {
749
+ StringList items = new StringList();
750
+ for (int i = 0; i < count; i++) {
751
+ items.append(JSONObject.quote(keys[i]) + ": " + values[i]);
752
+ }
753
+ return "{ " + items.join(", ") + " }";
754
+ }
629
755
 
630
- // indices.put(keys[a], Integer.valueOf(a));
631
- // indices.put(keys[b], Integer.valueOf(b));
632
- }
633
-
634
-
635
- /**
636
- * Sort the keys alphabetically (ignoring case). Uses the value as a
637
- * tie-breaker (only really possible with a key that has a case change).
638
- *
639
- * @webref intdict:method
640
- * @brief Sort the keys alphabetically
641
- */
642
- public void sortKeys() {
643
- sortImpl(true, false, true);
644
- }
645
-
646
- /**
647
- * Sort the keys alphabetically in reverse (ignoring case). Uses the value as a
648
- * tie-breaker (only really possible with a key that has a case change).
649
- *
650
- * @webref intdict:method
651
- * @brief Sort the keys alphabetically in reverse
652
- */
653
- public void sortKeysReverse() {
654
- sortImpl(true, true, true);
655
- }
656
-
657
-
658
- /**
659
- * Sort by values in ascending order. The smallest value will be at [0].
660
- *
661
- * @webref intdict:method
662
- * @brief Sort by values in ascending order
663
- */
664
- public void sortValues() {
665
- sortValues(true);
666
- }
667
-
668
-
669
- /**
670
- * Set true to ensure that the order returned is identical. Slightly
671
- * slower because the tie-breaker for identical values compares the keys.
672
- * @param stable
673
- */
674
- public void sortValues(boolean stable) {
675
- sortImpl(false, false, stable);
676
- }
677
-
678
-
679
- /**
680
- * Sort by values in descending order. The largest value will be at [0].
681
- *
682
- * @webref intdict:method
683
- * @brief Sort by values in descending order
684
- */
685
- public void sortValuesReverse() {
686
- sortValuesReverse(true);
687
- }
688
-
689
-
690
- public void sortValuesReverse(boolean stable) {
691
- sortImpl(false, true, stable);
692
- }
693
-
694
-
695
- protected void sortImpl(final boolean useKeys, final boolean reverse,
696
- final boolean stable) {
697
- Sort s = new Sort() {
698
- @Override
699
- public int size() {
700
- return count;
701
- }
702
-
703
- @Override
704
- public int compare(int a, int b) {
705
- int diff = 0;
706
- if (useKeys) {
707
- diff = keys[a].compareToIgnoreCase(keys[b]);
708
- if (diff == 0) {
709
- diff = values[a] - values[b];
710
- }
711
- } else { // sort values
712
- diff = values[a] - values[b];
713
- if (diff == 0 && stable) {
714
- diff = keys[a].compareToIgnoreCase(keys[b]);
715
- }
716
- }
717
- return reverse ? -diff : diff;
718
- }
719
-
720
- @Override
721
- public void swap(int a, int b) {
722
- IntDict.this.swap(a, b);
723
- }
724
- };
725
- s.run();
726
-
727
- // Set the indices after sort/swaps (performance fix 160411)
728
- resetIndices();
729
- }
730
-
731
-
732
- /**
733
- * Sum all of the values in this dictionary, then return a new FloatDict of
734
- * each key, divided by the total sum. The total for all values will be ~1.0.
735
- * @return an IntDict with the original keys, mapped to their pct of the total
736
- */
737
- public FloatDict getPercent() {
738
- double sum = sum(); // a little more accuracy
739
- FloatDict outgoing = new FloatDict();
740
- for (int i = 0; i < size(); i++) {
741
- double percent = value(i) / sum;
742
- outgoing.set(key(i), (float) percent);
743
- }
744
- return outgoing;
745
- }
746
-
747
-
748
- /** Returns a duplicate copy of this object. */
749
- public IntDict copy() {
750
- IntDict outgoing = new IntDict(count);
751
- System.arraycopy(keys, 0, outgoing.keys, 0, count);
752
- System.arraycopy(values, 0, outgoing.values, 0, count);
753
- for (int i = 0; i < count; i++) {
754
- outgoing.indices.put(keys[i], i);
755
- }
756
- outgoing.count = count;
757
- return outgoing;
758
- }
759
-
760
-
761
- public void print() {
762
- for (int i = 0; i < size(); i++) {
763
- System.out.println(keys[i] + " = " + values[i]);
764
- }
765
- }
766
-
767
-
768
- /**
769
- * Save tab-delimited entries to a file (TSV format, UTF-8 encoding)
770
- */
771
- public void save(File file) {
772
- PrintWriter writer = PApplet.createWriter(file);
773
- write(writer);
774
- writer.close();
775
- }
776
-
777
-
778
- /**
779
- * Write tab-delimited entries to a PrintWriter
780
- */
781
- public void write(PrintWriter writer) {
782
- for (int i = 0; i < count; i++) {
783
- writer.println(keys[i] + "\t" + values[i]);
784
- }
785
- writer.flush();
786
- }
787
-
788
-
789
- /**
790
- * Return this dictionary as a String in JSON format.
791
- */
792
- public String toJSON() {
793
- StringList items = new StringList();
794
- for (int i = 0; i < count; i++) {
795
- items.append(JSONObject.quote(keys[i])+ ": " + values[i]);
796
- }
797
- return "{ " + items.join(", ") + " }";
798
- }
799
-
800
-
801
- @Override
802
- public String toString() {
803
- return getClass().getSimpleName() + " size=" + size() + " " + toJSON();
804
- }
756
+ @Override
757
+ public String toString() {
758
+ return getClass().getSimpleName() + " size=" + size() + " " + toJSON();
759
+ }
805
760
  }