как получить пользовательский ввод (args) и передать его методу сбора данных

#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 раз. Также можете ли вы отметить мой вопрос как ответивший? Однако я не уверен, что этот комментарий здесь ответил на ваш вопрос.