在以下代码中,我定义了一种称为 loadItems
的方法,它假定在文本文件的每行中创建一个类型Item
的数组列表。
- 项目对象由包含名称的字符串和带有数字的int变量形成。
- 文本文件的每一行都包含一个名称,要存储在新项目中,其次是
=
,然后在此之前,需要存储在新项目中的数字。总结,每行看起来像:String=int
。
问题是,我没有返回新项目并将其存储在loadItems
数组列表中,而是因为它应该返回布尔值而遇到了一个错误。i映像这是因为新项目在a时内创建的,该功能检查了文本文件中的新行。
ArrayList<Item> loadItems() throws FileNotFoundException {
File phaseOneFile = new File("Phase-1.txt");
Scanner readPhaseOneFile = new Scanner(phaseOneFile);
while (readPhaseOneFile.hasNextLine()){
String actualLine = readPhaseOneFile.nextLine();
String[] actualLineToItem = actualLine.split("=");
Item newItem = new Item();
newItem.itemName=actualLineToItem[0];
newItem.itemWeight= Integer.parseInt(actualLineToItem[1]);
return loadItems().add(newItem);
}
}
几件事。
- 您返回得太早
- 您返回错误的东西
- 您没有出于明显的原因使用递归
首先,您应该仅返回 您已经构建了列表,因此请删除return
。
第二,循环结束后返回列表
第三,在实际的ArrayList
中积聚东西,然后返回而不是递归。
第四,无需返回混凝土类型,只需返回List<Item>
。
List<Item> loadItems() throws FileNotFoundException {
File phaseOneFile = new File("Phase-1.txt");
Scanner readPhaseOneFile = new Scanner(phaseOneFile);
List<Item> items = new ArrayList<Item>();
while (readPhaseOneFile.hasNextLine()){
String actualLine = readPhaseOneFile.nextLine();
String[] actualLineToItem = actualLine.split("=");
Item newItem = new Item();
newItem.itemName=actualLineToItem[0];
newItem.itemWeight= Integer.parseInt(actualLineToItem[1]);
items.add(newItem);
}
return items;
}
您正在返回loadItems().add(newItem);
。从Collection#add()
的Javadocs(ArrayList
实施(:
如果该集合因呼叫而更改
,则返回true
https://docs.oracle.com/javase/8/docs/api/java/java/util/collection.html#add-e--e-
显然true
是类型boolean
。但是,在您的方法签名(ArrayList<Item> loadItems() throws FileNotFoundException
(中,您声明您的方法返回ArrayList<Item>
。
要解决此问题,请在方法开始时创建一个新列表,请在使用list.add()
的while
循环中附加到它,然后在方法末尾加入return list;
。
因为您的方法返回arraylist,您需要更改代码。现在,在第一个介绍中,您将从list.add((方法返回布尔值。这是不对的。在段循环中,您应该在列表中和外部添加一个项目应该返回阵列列表。将您的代码修改为:
ArrayList<Item> loadItems() throws FileNotFoundException {
ArrayList<Item> itemList = new ArrayList<>();
File phaseOneFile = new File("Phase-1.txt");
Scanner readPhaseOneFile = new Scanner(phaseOneFile);
while (readPhaseOneFile.hasNextLine()){
String actualLine = readPhaseOneFile.nextLine();
String[] actualLineToItem = actualLine.split("=");
Item newItem = new Item();
newItem.itemName=actualLineToItem[0];
newItem.itemWeight= Integer.parseInt(actualLineToItem[1]);
itemList.add(newItem);
}
return itemList;
}