2015-03-07 5 views
-1

У меня есть следующий код, который я пытаюсь преобразовать из C++ в Java. Предполагается, что код будет генерировать биномиальное дерево, которое будет использоваться для расчета цены опционов на акции. Вот следующий C++ код:Преобразование биномиального дерева в C++ в Java

class Price { 
public: 
    double stockPrice; 
    double optionPrice; 
}; 

int numIntervals = 500; 
Price ** binomialTree; 
binomialTree = new Price*[numIntervals+1]; 

for (i = 0; i <= numIntervals; i++) { 
    binomialTree[i] = new Price[i + 1]; 
} 
for (i = 0; i <= numIntervals; i++) { 
    for (j = 0; j <= i; j++) { 
     binomialTree[i][j].stockPrice = sNaught * pow(up, j) * pow(down, i-j); 
    } 
} 

Мне нужен код Java, который инициализирует биномиальное дерево, так что я могу итерацию через него и рассчитать различные цены. Часть, которая меня отбрасывает, это binomialTree[i] = new Price[i+1];, которая встречается внутри цикла, делая динамический 2D-массив, который вы не можете сделать в java. Это то, с чем я столкнулся, когда работает, но результирующая цена неверна по сравнению с приведенными значениями.

class Price { 
    double stockPrice = 0.0; 
    double optionPrice = 0.0; 

    Price(double sP, double oP) { 
     this.stockPrice = sP; 
     this.optionPrice = oP; 
    } 
} 

int i,j; 
Price[][] binomialTree = new Price[numIntervals+1][numIntervals+2]; 

for (i = 0; i <= numIntervals; i++) { 
    for (j = 0; j <= i; j++) { 
     binomialTree[i][j] = new Price(option.getsNought() * Math.pow(up, j) * Math.pow(down, i-j), 0); 
    } 
} 
+3

Почему, по-вашему, вы не можете сделать это на Java? – RealSkeptic

+0

Ну нет указателей в java. И способ, которым 2d-массив инициализируется в коде C++, является динамическим. –

+0

На самом деле, java - это почти ТОЛЬКО основанные указатели и распределение кучи. Они называют их ссылкой, но поведение в значительной степени идентично указателям C++ (минус указатель арифметики). – MikeMB

ответ

2

В Java очень много двумерных массивов, длина строк которых динамична. Так как я не имею целые параметры, вот небольшой пример для вас:

 Price[][] binomialTree = new Price[20][]; 
    for (int i = 0 ; i < 20 ; i++) { 
     binomialTree[i] = new Price[i+1]; 
    } 

    for (int i = 0; i < 20; i ++) { 
      System.out.println(Arrays.toString(binomialTree[i])); 
    } 

Выхода этого (поскольку мы не заселены массивов):

 
[null] 
[null, null] 
[null, null, null] 
[null, null, null, null] 
... 

Это стоит отметить, что Java не имеет «двухмерных массивов» (в том смысле, что все измерения распределены вместе как последовательный блок памяти). Все, что у него есть, это одномерные массивы, базовый тип которых может быть ссылочным типом. И ссылочным типом может быть тип массива.

Заявление, такие как

Price[][] arr = new Price[5][7]; 

является лишь синтаксический сахар, который делает то же самое, как создание 5-элементной массив ссылок на с массивами Price, то создание 5 массивов 7 ссылок на Price и присвоения им каждый элемент этого первого массива.

Для официального обсуждения этого вопроса читайте the Java Language Specification.

+0

хорошо играл сэр .... –

Смежные вопросы