Преобразование массива байтов к массиву плаваний

Вы можете сосчитать вхождения и затем использовать этот объект для создания вашего окончательного массива.

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);

5
задан mghie 20 February 2009 в 16:59
поделиться

2 ответа

Вы представили код и на самом деле нашли, что это проблема? Что-то оказывается перед необходимостью, цикл... - Вы действительно уверенный, что это - узкое место в Вашем коде?

Сказав все это, необходимо смочь использовать FloatBuffer, который я подозреваю, делает то, что Вы хотите. К сожалению, JavaDoc Sun снижается, таким образом, я не могу легко связаться с или проверить документацию в минуту.

Для использования FloatBuffer Вы, вероятно, хотели бы:

  • Создайте FileChannel, связанный с файлом (например, с FileInputStream.getChannel)
  • Создайте ByteBuffer
  • Создайте FloatBuffer, переносящий ByteBuffer с ByteBuffer.asFloatBuffer
  • Читайте в ByteBuffer с FileChannel.read(byteBuffer)
  • Читайте из FloatBuffer

Я не особенно знаком/удобен с java.nio, таким образом, я надеюсь, что это все корректно - но это, вероятно, будет довольно трудно. Ваша токовая петля почти наверняка более проста, таким образом, я настоятельно рекомендую, чтобы Вы проверили производительность этого сначала! Вы могли бы хотеть перенести свой текущий FileInputStream в BufferedInputStream, btw.

9
ответ дан 13 December 2019 в 05:43
поделиться

На основе справки, обеспеченной 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);
}
3
ответ дан 13 December 2019 в 05:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: