【问题标题】:Searching through a text document multiple times in java在java中多次搜索文本文档
【发布时间】:2013-04-19 20:19:34
【问题描述】:

我已经到处寻找上述问题的答案。我一直在构建一个计算器,它将接受用户在文本文件中输入产品名称,程序将在文档中搜索产品名称,一旦找到它,它将记录名称旁边的整数和用它来计算价格。虽然我已经完成了所有这些工作,但我的主要问题是如果程序第一次没有找到该名称,则使程序多次运行该文档。就像现在一样,它将贯穿整个文档,并在到达文件末尾时结束。

这是文本文件

羊毛 15 1

种子 3 1

羽毛 3 1

字符串 2 1

牛肉 2 1

鱼 2 1

骨头 1 1

铁 1 1

火药 1 1

萤石 1 7

墨水袋 1 2

肉体 2 1

鸡蛋 2 1

这是我的代码

public static void main(String[]args)throw 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 温度 = 0,计数器 = 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");

} }

我只需要知道要修复什么以便使它到达文件末尾,如果它还没有找到名称返回文件的开头并再次查看。

感谢您提供的任何帮助。我希望我的问题很清楚。

一些澄清。是的,我希望用户能够输入不同的名称并重新搜索文件,并且我添加了整个代码以让人们知道发生了什么。

【问题讨论】:

  • 没有意义。如果第一次没有名字,就不会是第二次了。您的意思是允许用户输入不同的名称,然后重新搜索文件吗?
  • inFile 是什么类的实例?

标签: java text file-io for-loop while-loop


【解决方案1】:

为什么要搜索多次?为什么不将所有信息存储在地图中并进行查找呢?这是一些关键部分(不是完整的工作代码):

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;
}

【讨论】:

  • 好吧,你的答案可能是最好的,但我很担心,因为当我读取其中的文件时,会有两个整数而不是 1. will things.put(Name,nums);请允许我做一些事情。put(name, nums, nums); ?还是超出了 hashMap 的范围。我以前从未使用过,所以我想知道。
  • @user2321247:它只能做一个对象。由于某种原因,代码消失了,但 nums 应该是一个 Integer[] 数组。检查 Java 的文档页面 - docs.oracle.com/javase/6/docs/api/java/util/HashMap.html
  • 谢谢!它似乎工作得很好,但是我在声明 hashmap 对象的行上得到了一个错误的构造函数错误。你知道那可能是什么吗?
  • @user2321247:我想是因为我忘记了最后的括号(上面更新了)
【解决方案2】:

不确定您的许多类的类型 - 它们是输入流等吗?但建议看看这个 SO 问题:

java file input with rewind()/reset() capability

filechannel.position(0) 可能是您要查找的内容,也可能是 RandomAccessFile 倒带方法或 inputstreamreader.mark

哪个更好取决于您是否想使用流,或者不介意任何一种方式,您是否介意文件在内存中缓冲等等。

顺便说一句,如果您的文件大小“小”(无论这些天意味着什么),您可以考虑将整个文件加载到内存中。还是每次都重新读取文件?

【讨论】:

    【解决方案3】:

    如果您使用的是 Scanner,请尝试使用 findWithinHorizo​​n() 方法而不是 next()。它查找指定的模式并且在失败时不推进指针。如果您不使用 Scanner - 请使用它;)请参阅 javadocs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多