#java #collections #args
#java #Коллекции #аргументы
Вопрос:
Я нашел Java-код с открытым исходным кодом, который выполняет вычисление IRR. Я хотел бы интегрировать это в свою программу. Идея состоит в том, чтобы ввести в эту Java-программу некоторые суммы и даты, затем она вычисляет IRR и возвращает единственное число (double). Программа исключает класс коллекции в качестве входных данных (комбинация чисел и дат), затем возвращает число. Он может принимать столько чисел и дат, сколько захочет пользователь. В документации есть несколько примеров кода, но все они показывают, как эта программа получает параметры в жестко закодированном коде. Я пытаюсь изменить это, чтобы программа получала пользовательский ввод, разбирала его на числа и даты, затем в идеале преобразовывала их в коллекцию и передавала в программу Java. Я не смог этого сделать. Я не смог создать объект collection на основе пользовательского ввода и передал его программе. Я прилагаю пример кода, который выполняет жестко заданные в коде значения, все, что я хочу написать класс, который будет динамически фиксировать пользовательский ввод (комбинированное значение и дату, в идеале одно значение, одна дата и так далее) и передавать его методу XIRR.
public double xirr_issue5b() {
double rate = new Xirr(
new Transaction(-2610, "2001-06-22"),
new Transaction(-2589, "2001-07-03"),
new Transaction(-5110, "2001-07-05"),
new Transaction(-2550, "2001-07-06"),
new Transaction(-5086, "2001-07-09"),
new Transaction(-2561, "2001-07-10"),
new Transaction(-5040, "2001-07-12"),
new Transaction(-2552, "2001-07-13"),
new Transaction(-2530, "2001-07-16"),
new Transaction(-9840, "2001-07-17"),
new Transaction(38900, "2001-07-18")
).xirr();
return rate;
}
Ответ №1:
Следует отметить, что реализация XIRR в пакете с открытым исходным кодом, на который вы ссылаетесь, имеет public Xirr(Transaction... tx){
который (если вы не знакомы с аргументами var) означает, что у вас может быть любое количество элементов транзакций. Что это также позволяет вам вводить в массив. XIRR также может принимать коллекции (такие как ArrayLists), поэтому в следующем коде я делаю следующее:
- создайте
Scanner
для чтения в пользовательском вводе - Создайте средство форматирования даты для преобразования строк в даты
- создайте
ArrayList
, который хранит транзакции - Счетчик итераций, основанный на пользовательском вводе
for
Цикл, который повторяетiterations
количество, заданное пользователем, и добавляет новоеTransaction
кArrayList
каждой итерации, принимая следующий пользовательский int и следующую строку (преобразованную в дату с помощью date formatter).- Я передаю ArrayList в метод Xirr.
Попробуйте это:
//import java.text.SimpleDateFormat;
//import java.util.ArrayList;
//import java.util.Date;
//import java.util.Scanner;
public double xirr_issue5b() {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Scanner sc = new Scanner(System.in);
ArrayList<Transaction> trans = new ArrayList<Transaction>();
int iterations = sc.nextInt();
for(int k = 0; k < iterations; k ) {
trans.add(new Transaction(sc.nextInt(), format.parse(sc.next())));
}
double rate = Xirr(trans).xirr();
sc.close();
return rate;
}
Комментарии:
1. Спасибо, выглядит как хороший подход. Я не понял, как вы использовали sc.nextInt для ограничения цикла for. Разве это не возвращает следующее целое число в строке?
2. Нет. nextInt звучит так: «Привет, человек. Вы вводили в int? Да? Хорошо, давайте преобразуем это строковое значение int в целое число с помощью Integer.parseInt(). Нет? Это не был int? Хорошо, давайте создадим inputmistmatcherror. Оглядываясь назад, я должен был учесть, если кто-то сначала не введет количество значений-дат, которые должны быть введены. Например, если бы я набрал «hi», тогда он сказал бы «нет» и вышел из программы. Если бы я хотел 10 транзакций, то я бы ввел 10, а затем <значение> <дата> 10 раз. Также можете ли вы отметить мой вопрос как ответивший? Однако я не уверен, что этот комментарий здесь ответил на ваш вопрос.