Inventory.javaを記述して、次の機能を完了します。
1.程序首先打开并读取Inventory.txt中记录的所有库存记录,然后读取Transactions.txt,处理这个文件中包含的事务,记录发货记录到Shipping.txt,并记录错误信息到Errors.txt中。最后更新库存到另外一个文件NewInventory.txt中。
2.文件Inventory.txt和NewInventory.txt的每行包含一个存货记录,没条记录包含下面一些字段息,这些字段之间用一个tab分开(见后面的文件格式):
フィールド
形式と意味
商品番号
文字列タイプ、貨物番号
量
整数、商品の数量
サプライヤー
文字列タイプ、サプライヤ番号
説明
文字列タイプ、貨物の説明
3.字段Items按照从小到大的顺序写入文件的。注意Item号不必连续,如Item号为752的后面可能是800。
4.文件Transactions.txt包含几个不同的处理记录(每行一条记录)。每条记录前面以一个大写字母开头,表示这条记录是什么类型的事务。在不同的大写字母后面是不同的信息格式。所有的字段也是以tab键分开的(见Transactions.txt文件格式)。
5.5。「O」(注文の最初の文字)で始まるトランザクションは、これが出荷注文であることを示します。つまり、特定の種類の商品を特定の顧客に送信する必要があります。アイテム
番号と数量の形式は、上記の表で定義されているとおりです。カスタム番号は、上記のサプライヤー番号と同じです。注文レコード(「O」で始まるトランザクション)の処理とは、在庫レコードの対応する商品の数量を減らし(削減数量=請求書の数量)、出荷情報をShipping.txtに記録することを意味します。注:Inventory.txtの数量は0以上である必要があります。在庫数量が特定の種類の商品の請求書の数量より少ない場合、システムは請求書の処理を停止し、エラーメッセージをErrors.txtに記録する必要があります。 。特定の種類の商品に対して複数の請求書があり、総在庫がこれらの請求書の合計より少ない場合、システムは、請求書の小から大までの限られた数量に従って顧客を満足させる必要があります。つまり、特定の種類の商品について、少量の請求書が以前に処理されていない場合、大量の請求書は処理されません。(この処理原則は、請求書がTransactions.txtに記録される順序の影響を受けません)
6.6。「R」で始まるトランザクションは、これが到着注文レコードであることを示します。「R」の後には、アイテム番号とその数量数量があります。到着オーダーの処理とは、在庫内の対応する商品の数量を増やすことを意味します(増加した数量=到着オーダーの数量)。注:Transactions.txtファイルで、納品書が納品書の後に表示される場合、納品書の商品の数量を使用して、納品書の数量を入力できます(Transactions.txtのように、優先度として理解できます)。マニフェストへの処理)。
7。「A」で始まるトランザクションは、新しい種類の商品を在庫に追加することを意味します(つまり、この種類の商品は以前は在庫に存在しませんでした)。「A」の後には、アイテム番号、サプライヤー、およびグッズ。新しいアイテムレコードを処理するということは、数量が0の新しいアイテムを在庫に追加することを意味します。Transactions.txtでは、新しい商品レコードは常に最初の到着注文の前に表示されると想定できます。
8.8。「D」で始まるトランザクションは、在庫から商品の種類を削除することを意味し、アイテム番号は「D」の後にあります。削除操作は、すべてのトランザクションが処理された後に常に処理され、表示される可能性のある同じ種類の商品の請求書の操作を削除前に正しく処理できるようにします。削除する特定の種類の商品の在庫数が0でない場合、システムはエラー情報をErrors.txtに記録する必要があります。
9.9。Shipping.txtファイルの各行は、特定の顧客への出荷情報を表しています。Shipping.txtの各行は、タブキーで区切られた、顧客番号、アイテム番号、および商品の数量です。請求書に同じ顧客番号とアイテム番号を持つ2つのレコードがある場合、2つの出荷情報をShipping.txtにマージする必要があります(つまり、それらの数量が合計されます)。
10.10。Errors.txtファイルには、未送信の出荷レコードと、在庫が0より大きい削除済みレコードが含まれています。Error.txtの各行には、請求書のカスタム番号、アイテム番号、および数量が含まれています。削除操作の場合、カスタム番号は0であり、数量数量は在庫内の数量です。
11.11。実験テストデータ:
Inventory.txt
Transactions.txt
package test;
public class Inventory{
String Item;
int Quantity;
String Supplier;
String Description;
Inventory(String _Item,int _Quantity,String _Supplier,String _Description){
Item=_Item;
Quantity=_Quantity;
Supplier=_Supplier;
Description=_Description;
}
}
package test;
public class transaction implements Comparable<Object>{
String type;
String Item;
int num;
String customer;
transaction(String _type,String _Item,int _num,String _customer){
type=_type;
Item=_Item;
num=_num;
customer=_customer;
}
@Override
public int compareTo(Object o) {
transaction t=(transaction)o;
return num-t.num;
}
}
package test;
import java.io.*;
import java.util.Collections;
import java.util.Vector;
public class example {
private static BufferedReader reader;
private static BufferedReader reader2;
public static void main(String[] args) throws Exception{
Vector<Inventory> invVector=readInventory("d:/Inventory.txt"); //读入Inventory并存入Vector中,每个元素为一项库存
Vector<transaction> tVector=readTransaction("d:/transaction.txt");//读入transaction并存入Vector中,每个元素为一个事件
Vector<transaction> oVector=new Vector<transaction>();
for(int i=0;i<tVector.size();i++) {
if(tVector.get(i).type.equals("R")) { //先处理R事件,即入库操作
for(int j=0;j<invVector.size();j++) {
if(invVector.get(j).Item.equals(tVector.get(i).Item)) {
invVector.get(j).Quantity+=tVector.get(i).num;
break;
}
}
}else if(tVector.get(i).type.equals("A")) { //A和R的优先级相同,同为入库操作,都是首先处理
invVector.add(new Inventory(tVector.get(i).Item,0,Integer.toString(tVector.get(i).num),tVector.get(i).customer));
}else if(tVector.get(i).type.equals("O")) { //O为出库操作,应待A和R处理完成后在处理
oVector.add(tVector.get(i)); //为了方便为O事件排序,即先处理出货量少的,当遍历查询到O时,存入新Vector,等待滞后处理
}
}
Collections.sort(oVector); //为O事件排序,即出货量少的订单优先级更高
for(int i=0;i<oVector.size();i++) { //开始遍历处理O事件
for(int j=0;j<invVector.size();j++) {
if(invVector.get(j).Item.equals(oVector.get(i).Item)) { //若库存量>=出货量,则执行O操作
if(invVector.get(j).Quantity>=oVector.get(i).num) {
invVector.get(j).Quantity-=oVector.get(i).num;
}else {
FileOutputStream fos=new FileOutputStream("d:/Errors.txt"); //若库存量<出货量,则说明该O操作违规,读入到d:/Errors.txt中
OutputStreamWriter writer=new OutputStreamWriter(fos,"UTF-8");
BufferedWriter bwriter=new BufferedWriter(writer);
bwriter.write(oVector.get(i).type+"\t"+oVector.get(i).Item+"\t"+oVector.get(i).num+"\t"+oVector.get(i).customer);
bwriter.newLine();
bwriter.flush();
bwriter.close();
}
}
}
}
for(int i=0;i<tVector.size();i++) { //最后处理D操作,即删除某货物
if(tVector.get(i).type.equals("D")) {
for(int j=0;j<invVector.size();j++) {
if(invVector.get(j).Item.equals(tVector.get(i).Item)) {
invVector.remove(j);
}
}
}
}
File file =new File("d:/Inventory.txt");
try { //把原d:/Inventory.txt清空
if(!file.exists()) {
file.createNewFile();
}
FileWriter fileWriter =new FileWriter(file);
fileWriter.write("");
fileWriter.flush();
fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
FileOutputStream fos=new FileOutputStream("d:/Inventory.txt");//把新的库存信息存入到d:/Inventory.txt中
OutputStreamWriter writer=new OutputStreamWriter(fos,"GBK");
BufferedWriter bwriter=new BufferedWriter(writer);
for(int i=0;i<invVector.size();i++) {
bwriter.write(invVector.get(i).Item+"\t"+invVector.get(i).Quantity+"\t"+invVector.get(i).Supplier+"\t"+invVector.get(i).Description);
bwriter.newLine();
}
bwriter.flush();bwriter.close();
}
private static Vector<Inventory> readInventory(String filename) throws Exception{ //读 Inventory
Vector<Inventory> invVector=new Vector<Inventory>();
reader2 = new BufferedReader(new InputStreamReader(new FileInputStream(filename)));
String line="";
while((line=reader2.readLine())!=null) {
String[] temp=line.split("\t"); //通过String.split()函数把每条库存的每项数据通过"\t"分开,为读操作做准备
if(temp.length==4) {
invVector.add(new Inventory(temp[0],Integer.parseInt(temp[1]),temp[2],temp[3]));
}
}
return invVector;
}
private static Vector<transaction> readTransaction(String filename) throws Exception{
Vector<transaction> tVector=new Vector<transaction>();
reader = new BufferedReader(new InputStreamReader(new FileInputStream(filename)));
String line="";
while((line=reader.readLine())!=null) {
String[] temp=line.split("\t"); //通过String.split()函数把事件包含的数据通过"\t"分开,为读操作做准备
if(temp.length==3) { //当temp.length==3,说明该事件为R
tVector.add(new transaction(temp[0],temp[1],Integer.parseInt(temp[2]),""));
}else if(temp.length==4){ //当temp.length==4,说明该事件为O或A
tVector.add(new transaction(temp[0],temp[1],Integer.parseInt(temp[2]),temp[3]));
}
else if(temp.length==2){ 当temp.length==2,说明该事件为D
tVector.add(new transaction(temp[0],temp[1],0,""));
}
}
return tVector;
}
}