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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/573348.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java forkjoin 简书_浅谈Java的Fork/Join并发框架

1. Fork/Join是什么Oracle的官方给出的定义是&#xff1a;Fork/Join框架是一个实现了ExecutorService接口的多线程处理器。它可以把一个大的任务划分为若干个小的任务并发执行&#xff0c;充分利用可用的资源&#xff0c;进而提高应用的执行效率。Fork/Join实现了ExecutorServi…

GCD API 理解 (一)

资料先行 GCD 深入理解&#xff1a;第一部分 GCD 深入理解&#xff1a;第二部分 以上两篇文章是关于GCD讲的比较好的文章&#xff0c;翻译自raywenderlich&#xff0c;该网站有很多关于iOS 开发的优秀文章。 引子 iOS 开发中有三大进阶性的技术点&#xff0c;分别是GCD、runti…

java怎么生成字母_在Java中生成字母序列

我的版本实现了Iterator并且保持一个int计数器.计数器值转换为相应的字符串&#xff1a;import com.google.common.collect.AbstractIterator;class Sequence extends AbstractIterator {private int now;private static char[] vs;static {vs new char[Z - A 1];for(char iA…

linux 的终端字体色和背景色的修改方法(二)

Linux终端下的颜色设置 2013-08-31 22:57:15分类&#xff1a; LINUX 在 ANSI 兼容终端&#xff08;例如 xterm、rxvt、konsole 等&#xff09;里&#xff0c; 可以用彩色显示文本而不仅仅是黑白。 本文示范了如何使用粗体和彩色的文字。 相信每一位Linux使用者都要面对 Bash。 …

java中的STL库_C++11 STL线程库实现一个简单的线程池

使用C11 STL线程库实现一个线程池。处理机制是抢占式的&#xff0c;即所有线程从一个队列(std::queue)中获取任务执行(计算字符串简单HASH值)&#xff0c;使用std::mutex和std::conditional_variable实现队列访问并发协调。#include #include #include #include #include #incl…

广搜 广搜 poj 3984

***求最短路径&#xff0c;然后再输出路径&#xff0c; BFS路径输出*** #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <stack> #include <queue> #include <cmath>using namespace std…

pycharm新建python file没有默认头_Pycharm 设置默认头的图文教程

Pycharm 设置默认头的图文教程1. 设置的路径是File->settings->Editor->File and Code Templates->Python Script内容见图&#xff1a;这样新建文件的时候就会默认头如下&#xff1a;这里说明下#!/usr/bin/evn python 和 #!/usr/bin/python的区别&#xff1a;第一种…

python redis订阅_Python 学习笔记 - Redis

Redis 和Memcached类似 也是一个开源的内存存储系统&#xff0c;存储格式也是通过键值对的方式。不过和memcached比起来&#xff0c;memcached的value只支持字符串&#xff0c;而redis支持字符串&#xff0c;列表&#xff0c;集合&#xff0c;hash等等&#xff1b;这些数据类型…

egret中loadingUI的自定义

loadingUI中是加载资源&#xff0c;此时如果想自定义loadingUI界面&#xff0c;那么此刻正在加载的图片肯定不能用了。 解决方法就是使用服务器资源 直接加载服务器资源就好了 class LoadingUI extends egret.Sprite { public constructor(){ super(); this.c…

python不支持的数据类型有achar bint cfloat dlist_第1篇:Cython的数据类型(第二部分)

Cython的C指针与C一样&#xff0c;尽管指针性与变量而不是类型相关联&#xff0c;但可以在类型或变量附近声*号。%%cythoncdef int *acdef int *b但这样在变量a,b写在一行,cython编译器会发出警告的信息,因此建议每个变量单独声明%%cythoncdef int *a,*bCython中的指针的解引操…

java 调用dll 方法 postmessage实现后台模拟按键_VB实现模拟键盘及模拟鼠标(后台操作)...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼接下来来研究下模拟鼠标模拟鼠标的常数整理&#xff0c;如下&#xff1a;WM_MOUSEFIRST 0x0200 //移动鼠标时发生WM_MOUSEMOVE 0x0200 //移动鼠标时发生&#xff0c;同WM_MOUSEFIRSTWM_LBUTTONDOWN 0x0201 //按下鼠标左键WM_LBUTTO…

【micropython】用python来进行BadUSB的USB-HID测试(含无线控制)

转载请注明&#xff1a;小五义http://www.cnblogs.com/xiaowuyi QQ群&#xff1a;64770604 本文以TPYBoardv101开发板为例讲解了利用micropython进行BadUSB的usb-HID设备测试的主要方法&#xff0c;使用mt7681模块进行了一个简单的实验&#xff0c;实现了手机摇控键盘输入的测…

php返回类中方法,php如何获取类中所有的方法名

php获取类中所有的方法名的方法&#xff1a;可以利用【get_class_methods()】函数来获取&#xff0c;【get_class_methods()】函数可以返回指定类中所有的方法名&#xff0c;并且会将方法名保存到数组中。【相关学习推荐&#xff1a;php编程(视频)】php获取类所有方法名的方法&…

C#学习之向量运算符重载

//未重载运算符&#xff0c;但编译通过&#xff1b;C#不允许重载运算符‘’&#xff0c;但如果重载‘’运算符&#xff0c;编译器会自动使用‘’运算符的重载来执行‘’运算符的操作&#xff1b; //‘-’、‘*’、‘&’和‘/’等所有赋值运算都遵循此规则&#xff1b; 1、若…

如何安装php5.5,源码安装php5.5

centos6.6首先上传php-5.5.10至服务器安装依赖环境yum -y install gcc gcc-c autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-d…

PHP 表单文件上传的原理,php多文件上传功能实现原理及代码

今天对多图片上传功能小小的研究了一下&#xff0c;把下面的代码整理出来&#xff0c;方便以后自己使用以及供大家交流1、upload.html页面&#xff0c;即先是input typefile的文件&#xff1a;图片上传第一张图片第二张图片第三张图片第四张图片第五张图片2、do_upload.php页面…

php的c方法,thinkphp的c方法的使用

这篇文章主要介绍了关于thinkphp的c方法的使用&#xff0c;有着一定的参考价值&#xff0c;现在分享给大家&#xff0c;有需要的朋友可以参考一下用过thinkphp的朋友都知道&#xff0c;C()方法在整个框架中用的非常普遍&#xff0c;C方法的实现非常简单&#xff0c;但是功能非常…

Fiddler中session的请求/响应类型与图标对照表

转载于:https://www.cnblogs.com/chengchengla1990/p/5681978.html

php打印矩阵,PHP实现顺时针打印矩阵(螺旋矩阵)的方法示例

这篇文章主要介绍了PHP实现顺时针打印矩阵(螺旋矩阵)的方法,涉及PHP基于数组遍历、运算模拟打印实现螺旋矩阵功能的相关操作技巧,对PHP感兴趣的朋友可以参考下本篇文章。本文实例讲述了PHP实现顺时针打印矩阵的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;问题…

NOIP2014 uoj20解方程 数论(同余)

又是数论题 Q&A Q&#xff1a;你TM做数论上瘾了吗 A&#xff1a;没办法我数论太差了&#xff0c;得多练&#xff08;shui&#xff09;啊 题意 题目描述 已知多项式方程&#xff1a; a0a1xa2x^2..anx^n0 求这个方程在[1, m ] 内的整数解&#xff08;n 和m 均为正整数&#x…