我一直在寻找上述问题的答案。我一直在构建一个计算器,它将在文本文件中输入产品名称的用户输入,程序将在文档中搜索产品的名称,一旦找到它,它将记录名称旁边的整数和用它来计算价格。虽然我已经完成了所有这些工作,但我的主要问题是如果第一次找不到名称,程序会多次运行文档。现在它将贯穿整个文档,一旦到达文件末尾就结束。
这是文本文件
羊毛15 1
种子3 1
羽毛3 1
String 2 1
牛肉2 1
鱼2 1
骨1 1
铁1 1
GunPowder 1 1
Glowstone 1 7
InkSack 1 2
肉2 1
鸡蛋2 1
这是我的代码
public static void main(String [] args)抛出FileNotFoundException {
//Declare Variables
String productName, productComp;
int productAmount, productPrice,itemNum, sum = 0;
boolean check = false;
Scanner console = new Scanner(System.in);
Scanner inFile = new Scanner(new FileReader("SelllingPrices.txt"));
System.out.println("Enter the number of items");
for(itemNum = console.nextInt(); itemNum > 0; itemNum--){
System.out.println("Enter the name of the item");
productComp = console.next();
while(check != true){
productName = inFile.next();
System.out.println(productName);
if(productName.compareTo(productComp) == 0){
productAmount = inFile.nextInt();
productPrice = inFile.nextInt();
sum += calculateSum(productAmount, productPrice, productComp);
check = true;
}
else{
check = false;
}
}
check = false;
}
calculateTotalPayout(sum);
}
public static int calculateSum(int productAmount,int productPrice,String productName){
int totalAmount, divisor, sum = 0;
Scanner console = new Scanner(System.in);
System.out.println("Enter the amount of " + productName + " recieved");
totalAmount = console.nextInt();
if(totalAmount > productAmount){
divisor = totalAmount / productAmount;
sum = productPrice * divisor;
return sum;
}
else{
sum = productPrice;
return sum;
}
}
public static void calculateTotalPayout(int sum){ int temp = 0,counter = 0;
if(sum > 64){
temp = sum;
while(temp >= 64){
temp -= 64;
counter++;
}
}
System.out.println("The total comes to " + sum + " emeralds or " + counter + " stacks of emeralds and " + temp + " emeralds left over");
} }
我只需要知道要修复什么,以便一旦到达文件的末尾,如果它没有找到名称返回到文件的开头并再次查看。
感谢您提供的任何帮助。我希望我对我的问题很清楚。
一些澄清。是的我希望用户能够输入不同的名称并重新搜索文件,我已添加了完整的代码,以便让人们了解最新情况。
答案 0 :(得分:0)
不确定这里有很多类的类型 - 它们是输入流等吗?但建议看一下这个问题:
java file input with rewind()/reset() capability
filechannel.position(0)可能是你要找的,或者是RandomAccessFile的rewind方法,或者是inputstreamreader.mark
哪个更好取决于你是想使用流,还是不介意任何一种方式,你是否介意将文件缓存在内存中等等。
顺便提一下,如果您的文件大小“很小”(这些天意味着什么),您可以考虑将整个文件加载到内存中。或者每次只是重新读取文件?
答案 1 :(得分:0)
如果您使用的是扫描仪,请尝试使用 findWithinHorizon()方法而不是 next()。它查找指定的模式,并且在失败时不会使指针前进。如果您不使用Scanner - 请使用它;)请参阅javadocs
答案 2 :(得分:0)
为什么要多次搜索?为什么不将所有信息存储在地图中并进行查找?这是一些关键部分(不是完整的工作代码):
HashMap<String,Integer[]> things = new HashMap<String,Integer[]>();
// Read each line and add to HashMap using:
Name = productName;
nums[0] = inFile.nextInt();
nums[1] = inFile.nextInt();
things.put(Name,nums);
// When you're done, ask the user what they're looking for and look it up.
productComp = console.next();
Integer[] nums = things.get(productComp);
if(nums == null){ // or try/catch for NullPointerException
// Doesn't exist! Try again!
}else{
productAmount = nums[0];
productPrice = nums[1];
sum += calculateSum(productAmount, productPrice, productComp);
check = true;
}