将字符串拆分为数组列表

时间:2014-02-22 05:17:31

标签: java arrays arraylist

一位朋友正在做一些功课。他必须从输入文件中获取帐号,检查帐户重复项,使用分段公式计算成本,然后按帐户添加它们以显示为逐项清单。它与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);

}

2 个答案:

答案 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