Нужна помощь в ускорении метода слияния элементов коллекции

369
07 марта 2017, 14:24

Есть метод который хранит объекты заявок типа:

class Order {
    private String book;
    private String operation;
    private int volume;
    private float price;
    private int orderId;
    Order(String book,
          String operation,
          int volume,
          float price,
          int orderId) {
        this.book = book;
        this.operation = operation;
        this.volume = volume;
        this.price = price;
        this.orderId = orderId;
    }
    // гетеры сетеры
}

Есть метод который проверяет что у двух объектов Order поле price одинаковое, а book и operation разные, и если это так, то проводит операцию автоматически.

Ну на пример: есть два Order у которых

1ый ордер - price = 10, operation = "SELL", volume = 100, book = "book-1";

2ой ордер - price = 10, operation = "BUY", volume = 130, book = "book-2";

Тогда 1ый ордер вообще исчезает а у второго volume становится 30

Либо если volume у обоих был один и тот-же они оба исчезают.

Либо если у первого ордера volume был больше на 20 то второй исчезает, а у первого становится 20.

Главное что price одинаковые и заявки с разными book и operation. Сколько смог купил/продал, что не смог, та часть запроса осталась.

Вот моя реализация:

private Collection<Order> automaticDeal(List<Order> orders) {
    for (int i = 0; i < orders.size(); i++) {
        for (int j = 1; j < orders.size(); j++) {
            if (bookNonEquals(orders.get(i), orders.get(j)) &&
                    operationEquals(orders.get(i), orders.get(j)) &&
                    priseEquals(orders.get(i), orders.get(j))
                    ) {
                if (orders.get(i).getVolume() < orders.get(j).getVolume()) {
                    int volume = orders.get(j).getVolume() - orders.get(i).getVolume();
                    orders.get(j).setVolume(volume);
                    orders.remove(i);
                }
                if (orders.get(i).getVolume() > orders.get(j).getVolume()) {
                    int volume = orders.get(i).getVolume() - orders.get(j).getVolume();
                    orders.get(i).setVolume(volume);
                    orders.remove(j);
                }
                if (orders.get(i).getVolume() == orders.get(j).getVolume()) {
                    orders.remove(j);
                    orders.remove(i);
                }
            }
        }
    }
    return new ArrayList<>(orders);
}
private boolean bookNonEquals(Order fst, Order snd) {
    return !fst.getBook().equals(snd.getBook());
}
private boolean operationEquals(Order fst, Order snd) {
    return fst.getOperation().equals(snd.getOperation());
}
private boolean priseEquals(Order fst, Order snd) {
    return fst.getPrice() == snd.getPrice();
}

Но она работает неприемлемо медленно. А как поправить не знаю, может быть использовать parallelStream() или еще как-то, не знаю. Помогите пожалуйста ускорить выполнение метода на сколько возможно у меня там 3 млн. объектов.

READ ALSO
добавление элементов списка из разных activity и их сохранение

добавление элементов списка из разных activity и их сохранение

Залача такая :есть 2 активити, с общими конструкциями, и разными textview

379
Преобразование строк в числа

Преобразование строк в числа

Почему метод IntegerparseInt(s) суммирует только первое число?( вместо всех вводимых чисел?)

292
Задержка KeyStroke эвента

Задержка KeyStroke эвента

Есть такой код:

290