因此,在我的部分作业中,我必须从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
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数据绑定或类似的库可能是一个解决方案。
尝试删除String item=“番茄,30,1.25,6.50”
并将之后的所有“项”替换为
清单。获取(您想要从中获取项目的位置)
你需要有一个明确的战略。
您的输入由行组成,而行又由字段组成。您(大概)的目标是将数据作为“记录”进行处理。您可以通过以下两种方式实现:
任何一种方法都会奏效。但是你需要决定你要采取哪种方法。。。坚持这一方针。
(如果您刚开始编写或复制代码时没有明确的策略,那么您很可能会陷入混乱,或者代码不懂,或者两者兼而有之。)
可能重复: 如何在Java中将字符串转换为int? 我的代码应该读取字符串,然后采取相应的操作,但如果字符串是一行数字,我需要这一行作为一个完整的数字(一个int)而不是作为一个字符串,这可以做到吗?
问题内容: 我正在从文件中读取行,然后使用它们。每行仅由浮点数组成。 我整理了几乎所有内容,将这些行转换为数组。 我基本上是这样做的(pseudopython代码) 这行得通,但是似乎有点违反直觉和反pythonic,我想知道是否有更好的方法来处理来自文件的输入,以使最后有一个充满浮点数的数组。 问题答案: 快速回答: 如果您经常处理此类数据,csv模块将有所帮助。 如果您感到疯狂,甚至可以使用完
假设我有以下数组列表: 并且必须遵守规则: 从数组列表 1 开始,我想形成新的以下数组列表: <李>猫狗 <李>鼠蛇 无论如何都可以这样做。我目前还没有找到任何字符串到字符串转换的内容。
我想做一个名为句子的字符串,包含“你好,世界,你好吗?”
问题内容: 我正在编写一个程序,以String数组(来自用户输入)的形式将观察结果集写入文件。我能够将观察值写入.txt文件,然后添加新观察值而不删除先前的数据,但是我所有的数据都在同一行上。 我需要将每组观察结果放在单独的行上。 另外,我将需要稍后能够访问该文件并从中读取文件。 我的代码当前如下所示:(观察到的是字符串数组) 我的输出当前看起来像这样: 我希望它看起来像这样: …等等 我该怎么做
我有一个变量: 基于StackOverflow上的大量文章,我找到了几种方法: 然而,在我学会所有这些方法之前,我正在使用另一种方法,即: 这是行不通的,因为它将只在中存储的第一个字符串。我不明白为什么它在分隔符是换行符的情况下不起作用,而它在其他分隔符下却起作用,例如: 删除了我自己提出的不能为此使用的答案。原来你可以。