Java:使用文本文件创建数据集

时间:2019-02-20 20:35:11

标签: java arraylist

我正在尝试制作一个程序,该程序将不同类型的美国硬币的总数求和,并将它们的值相加。硬币信息来自txt文件。第一行是一个整数,表示数据集的数量。每个数据集都是一行,其中的13个整数用一个空格隔开。每个整数代表许多硬币或钞票。首先是几美分,然后是刻痕,一直到一百美元的钞票。

我迷失了要将数据读入程序然后进行数学和求和的时间。我想我需要为每个数据集使用arraylists,但是到目前为止,我能弄清的是如何将整个txt文件(在第一个int之后)加载到单个数组列表中,而不是将等于数据集数量(每个文件5个)。我是Java和程序设计的新手,因此不胜感激。

我认为一旦加载了值,就可以很容易地将它们加起来,但是现在我很迷茫。

这是txt文件显示的内容:

  

5

     

4 0 2 3 0 0 0 0 0 0 0 0 0

     

0 0 0 0 0 0 0 0 0 0 0 0 0

     

1 2 3 4 5 6 7 8 9 10 11 12 13

     

4 0 2 3 10 10 2 1 2 1 10 1 100

     

10 10 10 10 5 5 5 5 2 2 2 2 1

到目前为止,这是我的代码:

import java.io.File;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class CountDollarsCF {

    public static void main(String[] args) throws FileNotFoundException {
        System.out.println("Enter file path.");
        Scanner reader = new Scanner(System.in);
        String input = reader.nextLine();
        File file = new File("src/" + input);
        Scanner data = new Scanner(file);

        int sets = 0;

        sets = data.nextInt();
        ArrayList<Integer> datasets;
        datasets = new ArrayList<>();    

       while(data.hasNextInt()){
            datasets.add(data.nextInt());
        }
        data.close();    
    }    
}

我应该补充一点,就是我只能使用有限的工具。我只涉及Lewis和Loftus撰写的Java软件解决方案的第5章。因此,我们还没有学习过地图,转换,哈希图或集合。我们只需要排列数组列表,并创建一些类。我将截断到最接近的整数,目标是输出类似以下的内容:

第1行:$ 0

第2行:$ 0

第3行:2297美元

第4行:$ 10289

第5行:$ 296

1 个答案:

答案 0 :(得分:1)

一个好的策略的提示。如果每行的总和必须为美元,则这是有效的。只知道使用double可能会失去一些精度。

经过修改以符合OP前提条件(仅ArrayList)。

try (final Scanner data = new Scanner(file)) {
    final int lines = data.nextInt();
    final Collection<Double> totalPerLine = new ArrayList<>(lines);

    for (int i = 0; i < lines; i++) {
        double sum = 0;

        for (int j = 0; j < 13; j++) {
            final int value = data.nextInt();
            sum += getDollars(j, value);
        }

        totalPerLine.add(sum);
        System.out.println("Line " + i + ": $" + sum);
    }
}

private static double getDollars(
        final int type,
        final int value) {
    switch (type) {
        case 0: // Penny
            return value / 100D;
        case 1: // Nickle
            return value / 20D;
        case 2: // Dime
            return value / 10D;
        case 3: // Quarter
            return value / 4D;
        case 4: // Half
            return value / 2D;
        case 5: // Dollar coin
        case 6: // Dollar bill
            return value;
        case 7: // Two dollars bill
            return value * 2D;
        case 8: // Five dollars bill
            return value * 5D;
        case 9: // Ten dollars bill
            return value * 10D;
        case 10: // Twenty dollars bill
            return value * 20D;
        case 11: // Fifty dollars bill
            return value * 50D;
        case 12: // A hundred dollars bill
            return value * 100D;
        default:
            return 0;
    }
}