···
// Use a 7th-order curve to simulate the name length distribution.
// It gives us mostly short names, but with large outliers.
var nameLen = (int) (yOffset + factor * Math.pow(rnd.nextDouble() - xOffset, power));
104
-
minLen = Integer.min(minLen, nameLen);
105
-
maxLen = Integer.max(maxLen, nameLen);
var count = nameSource.read(buf, 0, nameLen);
throw new Exception("Name source exhausted");
110
-
var name = new String(buf, 0, nameLen).trim();
111
-
while (name.length() < nameLen) {
112
-
name += readNonSpace(nameSource);
108
+
var nameBuf = new StringBuilder(nameLen);
109
+
nameBuf.append(buf, 0, nameLen);
110
+
if (Character.isWhitespace(nameBuf.charAt(0))) {
111
+
nameBuf.setCharAt(0, readNonSpace(nameSource));
113
+
if (Character.isWhitespace(nameBuf.charAt(nameBuf.length() - 1))) {
114
+
nameBuf.setCharAt(nameBuf.length() - 1, readNonSpace(nameSource));
116
+
var name = nameBuf.toString();
while (names.contains(name)) {
115
-
name = name.substring(1) + readNonSpace(nameSource);
118
+
nameBuf.setCharAt(rnd.nextInt(nameBuf.length()), readNonSpace(nameSource));
119
+
name = nameBuf.toString();
117
-
while (name.getBytes(StandardCharsets.UTF_8).length > 100) {
118
-
name = name.substring(0, name.length() - 1);
123
+
actualLen = name.getBytes(StandardCharsets.UTF_8).length;
124
+
if (actualLen <= 100) {
127
+
nameBuf.deleteCharAt(nameBuf.length() - 1);
128
+
if (Character.isWhitespace(nameBuf.charAt(nameBuf.length() - 1))) {
129
+
nameBuf.setCharAt(nameBuf.length() - 1, readNonSpace(nameSource));
131
+
name = nameBuf.toString();
if (name.indexOf(';') != -1) {
throw new Exception("Station name contains a semicolon!");
137
+
minLen = Integer.min(minLen, actualLen);
138
+
maxLen = Integer.max(maxLen, actualLen);
var lat = Float.parseFloat(row.substring(row.indexOf(';') + 1));
// Guesstimate mean temperature using cosine of latitude
var avgTemp = (float) (30 * Math.cos(Math.toRadians(lat))) - 10;