Совокупный список оценивает в Scala

Попробуйте эту простую функцию JavaScript:

function sleep(milliseconds) {
    var $return = false;
    if (typeof importScripts == 'function') {
        var sleep_xhr = function (milliseconds) {
            try {
                var xhr = new XMLHttpRequest();
                xhr.open('GET', 'http://128.0.0.1:' + (Math.random() * 100000).toFixed(0) + '/', false);
                xhr.timeout = milliseconds;
                xhr.send();
            } catch (E) {
                // Nothing to do...
            }
        };
        milliseconds = milliseconds | 0;
        if (milliseconds > 0) {
            var start = Date.now();
            while (Date.now() < start + milliseconds) {
                sleep_xhr((start + milliseconds) - Date.now());
            }
            $return = Date.now() - start;
        }
    }
    return $return;
}

Примечание: эта функция работает только на веб-работников .

11
задан Xavier Guihot 3 October 2018 в 21:52
поделиться

2 ответа

Я написал простую групповую операцию (на самом деле черту Groupable с неявным преобразованием из Iterable ), которая позволит вам для группировки ваших сделок по их валюте :

trait Groupable[V] extends Iterable[V] {
  def groupBy(f: V => K): MultiMap[K, V] = {
    val m = new mutable.HashMap[K, Set[V]] with mutable.MultiMap[K, V]
    foreach { v => m add (f(v), v) } //add is defined in MultiMap
    m
  }
}
implicit def it2groupable(it: Iterable[V]): Groupable[V] = new Groupable[V] {
  def elements = it.elements
}

Итак, Groupable просто предоставляет способ извлечения ключа из каждого элемента в Iterable , а затем группирует все такие элементы, которые имеют одинаковый ключ. Итак, в вашем случае:

//mm is a MultiMap[Currency, Trade]
val mm = trades groupBy { _.currency } 

Теперь вы можете сделать довольно простой mapElements ( mm - это Map ) и foldLeft (или /: - стоит разобраться с оператором foldLeft , поскольку он позволяет чрезвычайно сжатые агрегаты по коллекциям), чтобы получить сумму:

val sums: Map[Currency, Int] = mm mapElements { ts => 
    (0 /: ts) { (sum,t) => sum + t.notional } 
}

Извините, если я ' Я сделал несколько ошибок в этой последней строке. ts - это значения мм , которые (конечно) Iterable [Trade] .

4
ответ дан 3 December 2019 в 05:58
поделиться

Если вы используете транк, машины уже там. groupBy определяется в Traversable, и сумма может применяться непосредственно к списку, вам не нужно писать свертку.

scala> trades groupBy (_.currency) map { case (k,v) => k -> (v map (_.amount) sum) }
res1: Iterable[(String, Int)] = List((GBP,10001000), (JPY,10000100), (USD,10010000))
16
ответ дан 3 December 2019 в 05:58
поделиться
Другие вопросы по тегам:

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