java货物进销管理系统_java实验 货物进销管理系统
實驗二貨物進銷管理系統
一.實驗目的
1.掌握Java中文件的讀寫操作。
2.學會使用Java提供的實用類(Vector, ArrayList)來完成特定的功能。
3.掌握字符串類(String, StringBuffer)的使用。
4.掌握用面向對象的方法分析和解決復雜問題。
二.實驗內容
編寫一個Inventory.java完成以下功能(沒有學過Java文件處理之前,各位同學可以使用硬編碼將數據放進兩個Vector變量里。等學過Java文件處理之后,再補充數據文件讀取部分):
1.程序首先打開并讀取Inventory.txt中記錄的所有庫存記錄,然后讀取Transactions.txt,處理這個文件中包含的事務,記錄發貨記錄到Shipping.txt,并記錄錯誤信息到Errors.txt中。最后更新庫存到另外一個文件NewInventory.txt中。
2.文件Inventory.txt和NewInventory.txt的每行包含一個存貨記錄,每條記錄包含下面一些字段息,這些字段之間用一個tab分開(見后面的文件格式):
字段
格式和含義
Item number
字符串型,貨物編號
Quantity
整型,貨物數量
Supplier
字符串型,供應商編號
Description
字符串型,貨物描述
3.字段Items按照從小到大的順序寫入文件的。注意Item號不必連續,如Item號為752的后面可能是800。
4.文件Transactions.txt包含幾個不同的處理記錄(每行一條記錄)。每條記錄前面以一個大寫字母開頭,表示這條記錄是什么類型的事務。在不同的大寫字母后面是不同的信息格式。所有的字段也是以tab鍵分開的(見Transactions.txt文件格式)。
5.以'O'開頭的事務表示這是一個發貨訂單,即某一種貨物應該發給特定的客戶。Item number和Quantity的格式如上面表格定義。Custom編號和上面的Supplier編號一致。處理一條定單記錄(以'O'開頭的事務)意味著從減少庫存記錄中相應貨物的數量(減少的數量=發貨單中的數量),記錄發貨信息到Shipping.txt中。注意:Inventory.txt中的quantity不應該小于0,如果對于某一種貨物,庫存的數量小于發貨單的數量的話,系統應該停止處理發貨單,并記錄出錯信息到Errors.txt。如果對于某一種貨物有多個發貨單,而且庫存總量小于這些發貨單的總和的話,系統應該按照發貨單中的數量從小到大的有限原則滿足客戶。也就是說,對于某一種貨物如果一個數量Quantity少的發貨單沒有處理之前,數量Quantity多的發貨單永遠不會被處理。(這種處理原則不受發貨單記錄在Transactions.txt的先后順序影響)
6.以'R'開頭的事務表示這是一個到貨單記錄,在'R'后面是Item number和它的數量Quanlity。處理一條到貨單意味著增加庫存中相應貨物的數量(增加的數量=到貨單中的數量)。注意:如果在Transactions.txt文件中,到貨單出現在發貨單之后,到貨單中的貨物數量可以用來填補發貨單中的數量(可以理解成在Transactions.txt中,優先處理到貨單)。
7.以'A'開頭的事務表示向庫存中增加一種新的貨物(即這種貨物以前庫存中沒有),在'A'后面是Item number,供應商supplier以及貨物的描述description。處理一個新增貨物記錄意味著向庫存中增加一個數量Quantity為0的新的Item。你可以假設在一個Transactions.txt中,新增貨物記錄總是出現在第一個到貨單之前。
8.以'D'開頭的事務表示從庫存中刪除一種貨物,在'D'后面是Item號。刪除操作總是在所有的事物處理之后才被處理,以保證對于可能出現的同一種貨物的發貨單的操作能在刪除之前被正確處理。如果要刪除的某種貨物的庫存量Quantity不為0的話,系統應該向Errors.txt記錄出錯信息。
9.文件Shipping.txt中的每一行代表給某一客戶的發貨信息。Shipping.txt中的每一行分別是客戶編號、Item號、貨物數量,它們之間用tab鍵分隔。如果發貨單中有兩條客戶編號和Item編號一樣的記錄,在Shipping.txt中應該將這兩條發貨信息合并(即將它們的數量相加)。
10.Errors.txt文件包含未發送的發貨記錄和庫存量大于0的刪除記錄。Errors.txt每一行包含Custom編號、Item編號以及發貨單上的數量Quantity。對于刪除操作,Custom編號為0,數量Quntity為庫存中的Quantity.
11.實驗測試數據:
Inventory.txt
Transactions.txt
提示:tab鍵分隔,在字符串處理的時候采用’\t’進行處理
三.思考題
1.?對整個實驗進行總結,寫出實驗心得。
import javafx.util.Pair;
import java.io.*;
import java.util.*;
public class Inventory {
public String itemNumber;
public int quantity;
public String supplier;
public String description;
public static void main(String[] args) throws IOException {
String s = null;
ListinventoryList = new ArrayList<>();
MapitemToIndex = new HashMap<>();
BufferedReader inventoryReader = new BufferedReader(new FileReader("src/Inventory.txt"));
while((s = inventoryReader.readLine()) != null){
String[] split = s.split("\t");
inventoryList.add(new Inventory(split[0], Integer.parseInt(split[1]), split[2], split[3]));
itemToIndex.put(split[0], inventoryList.size() - 1);
}
inventoryReader.close();
List> transactionsList = new ArrayList<>();
for(int i = 0; i < 4; i++){ transactionsList.add(new ArrayList<>()); }
BufferedReader transactionsReader = new BufferedReader(new FileReader("src/Transactions.txt"));
while((s = transactionsReader.readLine()) != null){
switch(s.charAt(0)){
case 'O':
transactionsList.get(0).add(s);
break;
case 'R':
transactionsList.get(1).add(s);
break;
case 'A':
transactionsList.get(2).add(s);
break;
case 'D':
transactionsList.get(3).add(s);
break;
default:
break;
}
}
transactionsReader.close();
for(String temp : transactionsList.get(2)){
String[] split = temp.split("\t");
inventoryList.add(new Inventory(split[1], 0, split[2], split[3]));
itemToIndex.put(split[1], inventoryList.size() - 1);
}
for(String temp : transactionsList.get(1)){
String[] split = temp.split("\t");
inventoryList.get(itemToIndex.get(split[1])).quantity += Integer.parseInt(split[2]);
}
Collections.sort(transactionsList.get(0), new SortByString());
Map> shippingList = new HashMap<>();
BufferedWriter errorWriter = new BufferedWriter(new FileWriter("src/Error.txt"));
for(String temp : transactionsList.get(0)){
String[] split = temp.split("\t");
if(Integer.parseInt(split[2]) <= inventoryList.get(itemToIndex.get(split[1])).quantity){
inventoryList.get(itemToIndex.get(split[1])).quantity -= Integer.parseInt(split[2]);
if(shippingList.containsKey(split[3]) && shippingList.get(split[3]).getKey() == split[1]){
shippingList.put(split[3], new Pair(split[1],
Integer.parseInt(split[2]) + shippingList.get(split[3]).getValue()));
}else{
shippingList.put(split[3], new Pair(split[1], Integer.parseInt(split[2])));
}
}else{
errorWriter.write(split[3] + "\t" + split[1] + "\t" + split[2]);
errorWriter.newLine();
}
}
for(String temp : transactionsList.get(3)){
String[] split = temp.split("\t");
if(inventoryList.get(itemToIndex.get(split[1])).quantity > 0){
errorWriter.write("0" + "\t" + itemToIndex.get(split[1]) + "\t"
+ inventoryList.get(itemToIndex.get(split[1])).quantity);
errorWriter.newLine();
}
inventoryList.remove((int)itemToIndex.get(split[1]));
}
errorWriter.close();
BufferedWriter shippingWriter = new BufferedWriter(new FileWriter("src/Shipping.txt"));
for (Map.Entry> entry : shippingList.entrySet()) {
shippingWriter.write(entry.getKey() + "\t"
+ entry.getValue().getKey() + "\t" + entry.getValue().getValue());
shippingWriter.newLine();
}
shippingWriter.close();
BufferedWriter newInventoryWriter = new BufferedWriter(new FileWriter("src/NewInventory.txt"));
for(Inventory inventory : inventoryList){
newInventoryWriter.write(inventory.itemNumber + "\t" + inventory.quantity
+ "\t" + inventory.supplier + "\t" + inventory.description);
newInventoryWriter.newLine();
}
newInventoryWriter.close();
}
public Inventory(String itemNumber, int quantity, String supplier, String description) {
this.itemNumber = itemNumber;
this.quantity = quantity;
this.supplier = supplier;
this.description = description;
}
}
class SortByString implements Comparator {
public int compare(Object o1, Object o2) {
String[] s1 = ((String)o1).split("\t");
String[] s2 = ((String)o2).split("\t");
return Integer.parseInt(s1[2]) > Integer.parseInt(s2[2]) ? 1 : -1;
}
}
//大吉大利,今晚AC
總結
以上是生活随笔為你收集整理的java货物进销管理系统_java实验 货物进销管理系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓开发 登录用户信息缓存_在Linux
- 下一篇: oracle一般人能不能学,Oracle