NetBeans项目

一个问题

这是本课程早期的期末考试题目。

为一个简单的电子市场编写一个管理买卖订单的程序。为简单起见,我们假设只有一种商品在这个交易所进行交易。为了进一步简化,我们还假设该系统中的赢博体育订单都不包括价格,只处理客户想要购买或出售的单位数量。参与该市场的交易者将通过交易所发给他们的整数ID号码进行识别。

您的程序将通过从名为“orders.txt”的文件中读取买入和卖出订单列表来工作。文本文件中的每一行都采用这种形式

<交易者id> <订单> <单位>

其中 是输入订单的交易者的id号, 是买入订单的“买入”或卖出订单的“卖出”, 是交易者想要买入或卖出的商品的单位数量。

您的程序将读取订单并尝试匹配买家和卖家。匹配订单后,您的程序将打印一个交易列表,其中一个交易者向另一个交易者出售一些单位。

例如,如果“orders.txt”文件包含文本

105买入250 333卖出100 409卖出500 632买入400 375卖出100

您的程序应该打印

333卖100套到105 409卖150套到105 409卖350套到632 375卖50套到632

交易应按照“先到先得”的顺序执行,按照订单文件中出现的顺序执行购买订单。

类的结构

解决这个问题需要几个类。前三个类是表示卖方、买方和销售的简单类:

公共类卖家{私有int id;私人int金额;public Seller(int id,int amount) {this。Id = Id;这一点。Amount =金额;}}公共类买方{私有int id;私人int金额;public Buyer(int id,int amount) {this。Id = Id;这一点。Amount =金额;}}公共类Sale{私有int sellerId;private int buyerId;私人int金额;public Sale(int seller,int buyer,int amount) {sellerId = seller;buyerId =买家;这一点。Amount =金额;}}

接下来,我们需要一个类来实现卖家和买家之间的匹配算法。为此,我们创建了一个Market类:

公共类市场{私有数组列表<卖家>卖家;private ArrayList<Buyer>;private ArrayList<Sale;public Market() {sellers = new ArrayList<Seller ();买家= new ArrayList<买家>();sales = new ArrayList<Sale ();}}

自顶向下设计

在这一点上,我上面概述的类是初稿形式。为了完成这些类,我们需要为每个类添加额外的方法。设计一个问题的解决方案在很大程度上是一个发现我们需要编写哪些方法的过程。在这个发现过程中,我们可以采用几种不同的方法。

我在编程中经常使用的一种方法是自顶向下设计。在这种方法中,我们首先在main方法中编写赢博体育程序的顶层代码。这为我们提供了需要完成的工作的大致轮廓,以及我们需要编写的方法的初始列表。

下面是Market类中赢博体育程序的主要方法:

public static void main(String[] args) {Market m = new Market();m.readOrders ();m.makeTrades ();m.saveSales ();}

这概述了我们需要在Market类中编写的三个主要方法:一个从文本文件中读取买入和卖出订单的方法,一个匹配买家和卖家的方法,以及一个将销售数据写入输出文件的方法。

在下一轮的过程中,我们编写这些方法。两个最简单的方法是读取和写入文件的方法:

公共无效readOrders(){扫描器输入= null;try {input = new Scanner(new File("orders.txt"));} catch(异常ex) {System.out。println(“无法打开订单文件”);system . exit (1);} while(input.hasNext()) {int id = input. nextt ();String what = input.next();int quantity = input.nextInt();if(what.equals("buy")){买方b =新的买方(id,quantity);buyers.add (b);} else{卖方s =新的卖方(id,数量);sellers.add(年代);}} input.close();}公共无效saveSales() {printwwriter pw = null;try {pw = new printwwriter (new File("sales.txt"));} catch(异常ex) {System.out。println(“无法打开文件进行写入”);system . exit (0);} for(Sale s: sales) {s. writeto (pw);} pw.close ();}

由于这两种方法遵循我们以前在示例中见过多次的熟悉模式,因此我不会详细评论这些方法。这里我要指出的一件小事是,我处理将销售额打印到输出文件问题的方式。为了简单起见,我将打印Sale的工作传递给了Sale对象本身,因为该对象包含了打印自己所需的赢博体育信息。下面是我添加到Sale类中的writeTo()方法的代码:

公共无效writeTo(printwwriter pw) {pw。println(sellerId + " sold " + amount + " units to " + buyerId);}

匹配算法

问题的核心是匹配卖家和买家的算法。在从输入文件读取交易的代码中,我将买方和卖方对象放在两个单独的列表中。匹配卖家和买家的算法将每次从这些列表中选取一个卖家和一个买家,并让他们交易尽可能多的单位。

我们必须处理的一个小问题是,大多数情况下,卖方和买方想要交易的金额不同。例如,我们可能有一个卖家想要卖200个单位,而买家只想买100个单位。在这种情况下,想要交易较少单位的参与者决定交易。在本例中,我们将创建一个Sale,其中卖方向买方出售100个单位。这将满足买方的要求:然后我们可以从买方列表中删除该买方。这只能部分满足卖方的要求,因此我们必须将卖方想要出售的数量减少100个单位,然后将卖方留在列表中,以便在下一轮中与另一个买家匹配。

下面是完成交易的方法的完整代码:

public void makeTrades() {while(卖方。size() > 0 &&买方。size() > 0){//将卖方放在卖方线的前面//将买方放在买方线的前面卖方=卖方.get(0);买方b =买方.get(0);if(s.getQuantity() > b.getQuantity()) {Sale Sale = new Sale(s.getId(),b.getId(),b.getQuantity());sales.add(销售);buyers.remove (0);s.reduceQuantity (b.getQuantity ());} else if(s.getQuantity() == b.getQuantity()){Sale Sale = new Sale(s.g ettid (),b.getQuantity(),b.getQuantity());sales.add(销售);sellers.remove (0);buyers.remove (0);} else {Sale Sale = new Sale(s.getId(),b.getId(),s.getQuantity());sales.add(销售);sellers.remove (0);b.reduceQuantity (s.getQuantity ());}}

这段代码将要求我们向Seller和Buyer类添加一些额外的方法。同样,这是发现我们需要什么方法的过程的一部分。

在这些说明的顶部,您将发现一个按钮,该按钮允许您下载包含本示例完整源代码的项目。