首页 > 解决方案 > Java:使用文本文件创建数据集

问题描述

我正在尝试制作一个程序来获取不同类型的美国硬币的总数,并将它们的值加起来。硬币信息来自一个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 Software Solutions 的第 5 章。所以我们还没有学习地图、转换、哈希图或集合。我们只需要数组列表,并创建一些类。我将截断到最接近的整数,目标是输出如下内容:

第 1 行:0 美元

第 2 行:0 美元

第 3 行:2297 美元

第 4 行:10289 美元

第 5 行:296 美元

标签: javaarraylist

解决方案


一个不错的策略的提示。如果每行的总和必须以美元为单位,这是有效的。只要知道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;
    }
}

推荐阅读