一位朋友正在做一些功课。他必须从输入文件中获取帐号,检查帐户重复项,使用分段公式计算成本,然后按帐户添加它们以显示为逐项清单。它与here {{3}}基本上是相同的作业。
这很难,因为它是java的介绍,我不是很好。我们得到两个错误:一个是Array out of bounds异常,另外两个是文件检查。由于我们使用for循环来计算每次通话的帐户成本,因此我们无法跟踪以前要检查的帐号。我建议使用ArrayList来保留以前的帐户并检查重复项,但我们无法弄清楚如何拆分成单独的ArrayList。
我们有这段代码:
public static void main(String[] args) throws IOException, ParseException{
ArrayList<String> acctHolder = new ArrayList<String>();
String tmp = "";
File fInput = new File("input_data.txt");
Scanner scInput = null;
scInput = new Scanner(fInput);
while (scInput.hasNextLine()){
tmp = scInput.nextLine();
acctHolder.add(tmp);
}
scInput.close();
DecimalFormat twoDForm = new DecimalFormat("#.##");
String acctNum = null;
String timeMin = null;
String totalTime = null;
double feeCost = 0;
double totalCost = 0;
double finalTotal = 0;
double sum = 0;
final double DAYRATE = 0.12;
final double NIGHTRATE = 0.05;
final double BASEFEE = 20.0;
ArrayList<Double> aTCost = new ArrayList<Double>();
System.out.println("Invoice");
System.out.println("*****************************");
System.out.println("Account \t Amount Due");
for(int i = 1; i < acctHolder.size(); i++)
{
String[] result = ((String) acctHolder.get(i)).split(" ");
acctNum = result[0];
timeMin = result[1];
totalTime = result[2];
double tTime = Double.parseDouble(totalTime);
String morningTime = "08:00";
String nightTime = "22:00";
DateFormat timeMins = new SimpleDateFormat("kk:mm");
Date callTime = timeMins.parse(timeMin);
Date dawnTime = timeMins.parse(morningTime);
Date niteTime = timeMins.parse(nightTime);
if(callTime.compareTo(dawnTime) > 0 && callTime.compareTo(niteTime) < 0 )
{
feeCost = tTime * DAYRATE;
totalCost = feeCost + BASEFEE;
}
else
{
feeCost = tTime * NIGHTRATE;
//totalCost = feeCost + BASEFEE;
}
aTCost.add(totalCost);
//double sum = 0;
for(Double d : aTCost)
sum += d;
System.out.println(acctNum + " $"+ feeCost);
}
//for(int i = 0; i < acctHolder)
System.out.println("*****************************");
System.out.println("Total " + sum);
}
答案 0 :(得分:1)
我使用链接中的示例数据运行您的代码,并得到以下结果:
Invoice
*****************************
Account Amount Due
10011 $1.224
10011 $1.476
10033 $1.7000000000000002
*****************************
Total 128.1
所以,我无法重现ArrayIndexOutOfBoundsException
(我最好的猜测是,你在阅读的文件中,其中一行中的字段少于3个,所以result[2]
超出界限)。
我能看到的第二个问题是你正在使用Double
。这就是为什么其中一个结果是“1.7000000000000002”而不是“1.7”。您应该查看BigDecimal
,并在搜索引擎上搜索“双重问题”或“浮动问题”。
第三个问题是,您要为文件中的每一行添加sum
的所有先前费用。这就是你的总和如此之高的原因。你必须将求和循环放在循环之外的行中。
要按帐户对结果进行分组,您需要的不是ArrayList
,而是HashMap
,使用帐号作为密钥。
答案 1 :(得分:0)
import java.util.ArrayList;
import java.util.Arrays;
String stringToSplit = "1,2,3,4,5";
ArrayList<String> arrayFromString =new ArrayList<String>(
Arrays.asList(stringToSplit.split(",")));
您可以拆分并存储在arrayList
中