Есть метод который хранит объекты заявок типа:
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 млн. объектов.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей