Вы можете сосчитать вхождения и затем использовать этот объект для создания вашего окончательного массива.
const arr = [1, 2, 4, 591, 392, 391, 2, 5, 10, 2, 1, 1, 1, 20, 20];
const count = arr.reduce((acc, val) => {
acc[val] = acc[val] + 1 || 1;
return acc;
}, {});
const result = Object
.keys(count)
.sort((a, b) => a - b)
.map((key) => count[key] === 1 ? +key : Array.from({ length: count[key] }).fill(+key));
console.log(result);
Вы представили код и на самом деле нашли, что это проблема? Что-то оказывается перед необходимостью, цикл... - Вы действительно уверенный, что это - узкое место в Вашем коде?
Сказав все это, необходимо смочь использовать FloatBuffer, который я подозреваю, делает то, что Вы хотите. К сожалению, JavaDoc Sun снижается, таким образом, я не могу легко связаться с или проверить документацию в минуту.
Для использования FloatBuffer Вы, вероятно, хотели бы:
Я не особенно знаком/удобен с java.nio, таким образом, я надеюсь, что это все корректно - но это, вероятно, будет довольно трудно. Ваша токовая петля почти наверняка более проста, таким образом, я настоятельно рекомендую, чтобы Вы проверили производительность этого сначала! Вы могли бы хотеть перенести свой текущий FileInputStream в BufferedInputStream, btw.
На основе справки, обеспеченной Jon, заключительный код похож на это:
byte[] bt = new byte[nLinks * 4];
List<Float> l = new ArrayList<Float>();
if (linkVar != 0 && timePeriod < nPeriods) {
long p1 = RECORDSIZE * (nNodes * NODEVARS + nLinks * LINKVARS);
long p2 = RECORDSIZE * (nNodes * NODEVARS + nLinks * (linkVar - 1));
long p3 = offset2 + (timePeriod * p1) + p2;
resultsFile.seek(p3);
resultsFile.read(bt, 0, nLinks * 4);
ByteBuffer bb = ByteBuffer.wrap(bt);
bb.rewind();
bb.asFloatBuffer().get(values);
}