如何获取用户输入(args)并将其传递给收集方法

时间:2019-03-25 18:11:40

标签: java collections args

我找到了执行IRR计算的开源Java代码。我想将此集成到我的程序中。想法是输入此Java程序一些数量和日期,然后计算IRR并返回一个数字(双精度)。该程序将集合类除外作为输入(数字和日期的组合),然后返回数字。它可以根据用户需要选择任意数量的日期和日期。文档中有一些示例代码,但是所有这些示例都显示了该程序如何在硬编码的代码中获取参数。我正在尝试对其进行更改,因此该程序将获得用户输入,将其解析为数字和日期,然后理想地将其转换为collection并将其传递给java程序。我做不到我无法根据用户输入创建集合对象并将其传递给程序。我附上了示例代码,该代码将值硬编码在代码中,我只想编写一个类来动态捕获用户输入(组合值和日期,最好是一个值,一个日期,等等)并将其传递给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 个答案:

答案 0 :(得分:0)

要注意的一件事是,您引用的开源软件包中的XIRR实现具有public Xirr(Transaction... tx){,如果您不熟悉var args,则意味着您可以具有任意数量的事务元素。它还允许您输入数组。 XIRR也可以接收Collections(例如ArrayLists),所以我在以下代码中所做的是:

  • 创建一个Scanner以读取用户输入
  • 创建日期格式化程序以将字符串转换为日期
  • 创建一个保存交易的ArrayList
  • 基于用户输入的迭代计数器
  • 一个for循环,循环用户定义的iterations数量,并在每次迭代中向Transaction添加一个新的ArrayList,以获取用户的下一个int和下一个String (通过日期格式器转换为日期)。
  • 我将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;
}