当前位置: 首页 > 知识库问答 >
问题:

从文件读入arraylist,然后将数组列表划分为多个字符串,这样我就可以单独解析它们

郎泰平
2023-03-14

因此,在我的部分作业中,我必须从Java之外的文件中提取信息。我已经完成了那部分。问题是,我不确定如何将文件中的字符串实际放入变量或循环中,以便下一部分使用。在下面的代码中,我需要替换代码中显示Item=Tomato的部分。。。从输出文件中使用单数行。我不知道该怎么做。我主要关心的是确保每一行没有硬编码,我猜这将涉及以某种方式或形式在每一行中循环。任何帮助都会很好。

我最初是如何添加硬编码的项目的,而不是我想做的是从一个输出文件中输入它们:

    list.add(new Item("Ketchup", 1.00, 10, 2.00, itemType.FOOD));
    list.add(new Item("Mayo", 2.00, 20, 3.0, itemType.FOOD));
    list.add(new Item("Bleach", 3.00, 30, 4.00, itemType.CLEANING));
    list.add(new Item("Lysol", 4.00, 40, 5.00, itemType.CLEANING));

密码

    Scanner s = new Scanner(new File("inventory.out"));

    ArrayList<String> inventoryList = new ArrayList<String>();

    while (s.hasNext()){
        inventoryList.add(s.next());
    }
    s.close();

    System.out.println(inventoryList);

    String item = "Tomato,30,1.25,6.50";// input String like the one you would read from a file

    String delims = "[,]"; //delimiter - a comma is used to separate your tokens (name, qty,cost, price)

    String[] tokens = item.split(delims); // split it into tokens and place in a 2D array.

    for (int i=0; i < 4; i++) {
        System.out.println(tokens[i]); // print the tokens.
    }

    String name = tokens[0]; System.out.println(name);

    int qty = Integer.parseInt(tokens[1]);System.out.println(qty);

    double cost = Double.parseDouble(tokens[2]);System.out.println(cost); 

控制台输出:

[番茄酱,1.00,10,2.00,itemType.FOOD,蛋黄酱,2.00,20,3.00,itemType.FOOD,漂白剂,3.00,30,4.00,itemType.CLEANING,Lysol,4.00,40,5.00,itemType.CLEANING]

输出文件的内容:

Ketchup,1.00,10,2.00,itemType.FOOD
Mayo,2.00,20,3.00,itemType.FOOD
Bleach,3.00,30,4.00,itemType.CLEANING
Lysol,4.00,40,5.00,itemType.CLEANING

共有3个答案

戴霖
2023-03-14
public static void main(String[] args) throws IOException {
    Path path = Paths.getPath("inventory.out");
    List<Item> items = readItems(path);
    for (Item item : items) {
        System.out.printf("Item (name='%s', capacity=%d,  cost=%f, price=%f)\n",
            item.getName(), item.getCapacity(), item.getCost(), item.getPrice());
    }
}
public class Item {
    private final String name;
    private final int quantity;
    private final double cost;
    private final double price;

    public Item (String name, int capacity, double cost, double price) {
        this.name = name;
        this.capacity = capacity;
        this.cost = cost;
        this.price = price;
    }

    // Getters omitted.
}

public class ItemUtils {
    /**
     * Read all lines from a file and maps them to items.
     *
     * @param path the path to the file, non-null
     * @return the list of items read from the file
     * @throws IOException if an I/O error occurs reading from the file or a malformed or unmappable byte sequence is read
     * @throws CustomRuntimeException if a line can't be mapped to an item
     */
    public static List<Item> readItems(Path path) throws IOException {
        Objects.requireNonNull(path);

        return Files.readAllLines(path, StandardCharsets.UTF_8)
            .stream()
            .map(ItemUtils::mapStringToItem)
            .collect(Collectors.toList());

    }

    /**
     * Maps a string to an item.
     *
     * @param str the string to map, non-null
     * @return the mapped item
     * @throws CustomRuntimeException if the string can't be mapped to an item
     */
    private static Item mapStringToItem(String str) {
        String[] tokens = str.split(",");

        if (tokens.length != 4) {
            String msg = String.format("Invalid item: 4 tokens expected, %d tokens found", tokens.length);
            throw new CustomRuntimeException(msg);
        }

        try {
            String name = tokens[0];
            int quantity = Integer.parseInt(tokens[1]);
            double cost = Double.parseDouble(tokens[2]);
            double price = Double.parseDouble(tokens[3]);
            return new Item(name, quantity, cost, price);
        } catch (NumberFormatException e) {
            throw new CustomRuntimeException("Invalid item: Type conversion failed", e);
        }
    }

    private ItemUtils() {
        // Utility class, prevent instantiation.
    }
}

/**
 * A custom runtime exception. Should be renamed to a more specific name.
 */
public class CustomRuntimeException extends RuntimeException {
    public CustomRuntimeException(String msg) {
       super(msg);
    }

    public CustomRuntimeException(String msg, Throwable e) {
        super(msg, e);
    }

readLines方法使用文件。readAllLines(…)将所有行读入字符串列表,其中每个字符串对应一行。然后我用Java8StreamAPI处理这个列表的字符串,list类提供了一个Stream()方法,返回一个

如果您想在集合对象上执行一些操作,例如:根据某些条件对该对象上的每个元素进行过滤、排序或操作,那么您可以使用Java8流特性以较少的代码轻松完成您的需求。

在这里,您可以找到对流的更实用的解释。

溪流地图(…)方法将mapStringToItem的方法引用作为其参数。当您查看mapStringToItem的签名时,您会看到它将单个字符串作为参数,并返回一个对象。这样您就可以阅读。地图(…) 调用为“使用方法mapStringToItem将文件中的每一行映射到一个项”。然后我从流中收集所有项目,并使用collect(…)将它们放入一个新列表中方法

让我们看一看mapStringToItem方法,该方法使用您分割项目值的方法:首先,我们在每个处分割行,返回一个字符串数组。目前,item类由4个属性组成,应该读取这些属性:名称、容量、成本和价格。因此,我们检查字符串数组是否具有适当的长度,如果没有,此实现将引发异常。如果我们有4个字符串(splittet by),我们就可以开始将字符串值解析为相应的数据类型,如果类型转换失败,就会抛出异常。最后但并非最不重要的一点是,我们返回一个带有解析值的项。

请注意,我建议不要使用浮点变量来存储货币值。看看Joda-Money

搜索为您处理数据类序列化的库可能是值得的。如果您不介意将格式更改为JSON,jackson数据绑定或类似的库可能是一个解决方案。

拓拔高畅
2023-03-14

尝试删除String item=“番茄,30,1.25,6.50” 并将之后的所有“项”替换为清单。获取(您想要从中获取项目的位置)

乌翰学
2023-03-14

你需要有一个明确的战略。

您的输入由行组成,而行又由字段组成。您(大概)的目标是将数据作为“记录”进行处理。您可以通过以下两种方式实现:

  1. 使用扫描仪读取行,并将每行拆分/扫描/标记为记录字段。
  2. 将整个输入流扫描为一系列标记或值,并动态地重新组合记录。

任何一种方法都会奏效。但是你需要决定你要采取哪种方法。。。坚持这一方针。

(如果您刚开始编写或复制代码时没有明确的策略,那么您很可能会陷入混乱,或者代码不懂,或者两者兼而有之。)

 类似资料:
  • 可能重复: 如何在Java中将字符串转换为int? 我的代码应该读取字符串,然后采取相应的操作,但如果字符串是一行数字,我需要这一行作为一个完整的数字(一个int)而不是作为一个字符串,这可以做到吗?

  • 问题内容: 我正在从文件中读取行,然后使用它们。每行仅由浮点数组成。 我整理了几乎所有内容,将这些行转换为数组。 我基本上是这样做的(pseudopython代码) 这行得通,但是似乎有点违反直觉和反pythonic,我想知道是否有更好的方法来处理来自文件的输入,以使最后有一个充满浮点数的数组。 问题答案: 快速回答: 如果您经常处理此类数据,csv模块将有所帮助。 如果您感到疯狂,甚至可以使用完

  • 假设我有以下数组列表: 并且必须遵守规则: 从数组列表 1 开始,我想形成新的以下数组列表: <李>猫狗 <李>鼠蛇 无论如何都可以这样做。我目前还没有找到任何字符串到字符串转换的内容。

  • 我想做一个名为句子的字符串,包含“你好,世界,你好吗?”

  • 问题内容: 我正在编写一个程序,以String数组(来自用户输入)的形式将观察结果集写入文件。我能够将观察值写入.txt文件,然后添加新观察值而不删除先前的数据,但是我所有的数据都在同一行上。 我需要将每组观察结果放在单独的行上。 另外,我将需要稍后能够访问该文件并从中读取文件。 我的代码当前如下所示:(观察到的是字符串数组) 我的输出当前看起来像这样: 我希望它看起来像这样: …等等 我该怎么做

  • 我有一个变量: 基于StackOverflow上的大量文章,我找到了几种方法: 然而,在我学会所有这些方法之前,我正在使用另一种方法,即: 这是行不通的,因为它将只在中存储的第一个字符串。我不明白为什么它在分隔符是换行符的情况下不起作用,而它在其他分隔符下却起作用,例如: 删除了我自己提出的不能为此使用的答案。原来你可以。