如何获取用户输入(args)并将其传递给收集方法
how to get user input (args) and pass it to a collection taking method
我发现了一个计算内部收益率的开源 Java 代码。我想将其整合到我的程序中。这个想法是输入这个 java 程序一些金额和日期,然后计算 IRR 和 returns 一个数字(双)。该程序除了集合 class 作为输入(数字和日期的组合)然后 returns 数字。它可以根据用户需要获取任意数量的数字和日期。文档中有一些示例代码,但它们都显示了该程序如何在硬编码代码中获取参数。我正在尝试更改它,因此程序会将用户输入解析为数字和日期,然后理想地将它们转换为集合并将其传递给 java 程序。我做不到。我无法根据用户输入创建集合对象并将其传递给程序。我附上了示例代码,它在代码中硬编码了值,我只想编写一个 class 来动态捕获用户输入(组合值和日期,理想情况下是一个值,一个日期等)并传递它到 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;
}
需要注意的是,您引用的开源包中的 XIRR 实现具有 public Xirr(Transaction... tx){
,这(如果您不熟悉 var args)意味着您可以拥有任意数量的交易元素。它还允许您输入一个数组。 XIRR 也可以接受 Collections(例如 ArrayLists) 所以我在下面的代码中做的是:
- 创建一个
Scanner
来读取用户输入
- 创建日期格式化程序以将字符串转换为日期
- 创建一个保存交易的
ArrayList
- 基于用户输入的迭代计数器
- 一个
for
循环,它循环用户预定义的 iterations
数量,并在每次迭代中添加一个新的 Transaction
到 ArrayList
并接收用户的下一个 int 和下一个字符串(通过日期格式化程序转换为日期)。
- 我将 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;
}
我发现了一个计算内部收益率的开源 Java 代码。我想将其整合到我的程序中。这个想法是输入这个 java 程序一些金额和日期,然后计算 IRR 和 returns 一个数字(双)。该程序除了集合 class 作为输入(数字和日期的组合)然后 returns 数字。它可以根据用户需要获取任意数量的数字和日期。文档中有一些示例代码,但它们都显示了该程序如何在硬编码代码中获取参数。我正在尝试更改它,因此程序会将用户输入解析为数字和日期,然后理想地将它们转换为集合并将其传递给 java 程序。我做不到。我无法根据用户输入创建集合对象并将其传递给程序。我附上了示例代码,它在代码中硬编码了值,我只想编写一个 class 来动态捕获用户输入(组合值和日期,理想情况下是一个值,一个日期等)并传递它到 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;
}
需要注意的是,您引用的开源包中的 XIRR 实现具有 public Xirr(Transaction... tx){
,这(如果您不熟悉 var args)意味着您可以拥有任意数量的交易元素。它还允许您输入一个数组。 XIRR 也可以接受 Collections(例如 ArrayLists) 所以我在下面的代码中做的是:
- 创建一个
Scanner
来读取用户输入 - 创建日期格式化程序以将字符串转换为日期
- 创建一个保存交易的
ArrayList
- 基于用户输入的迭代计数器
- 一个
for
循环,它循环用户预定义的iterations
数量,并在每次迭代中添加一个新的Transaction
到ArrayList
并接收用户的下一个 int 和下一个字符串(通过日期格式化程序转换为日期)。 - 我将 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;
}