【问题标题】:Supermarket Simulator using Queue使用队列的超市模拟器
【发布时间】:2014-08-04 19:18:43
【问题描述】:

我早些时候发布了这个问题,并就如何解决这个问题寻求帮助。我最终创建了一个客户类,它生成一个随机的名字和姓氏,并在每次创建新客户对象时为客户分配随机数量的杂货。

这里是代码

import java.util.Random;

public class Customer {

    private String lastName;
    private String firstName;
    private int groceryItems;

    private String[] last = { "Jordan", "James", "Bryant", "Bird", "Wade",
            "Bosh", "Griffin", "Durant", "WestBrook", "Anthony" };
    private String[] first = { "Michael", "Lebron", "Kobe", "Larry", "Dwayne",
            "Chris", "Blake", "Kevin", "Russell", "Carmelo" };

    public Customer() {
        Random pickLast = new Random();
        lastName = last[pickLast.nextInt(10)];

        Random pickFirst = new Random();
        firstName = first[pickFirst.nextInt(10)];

        Random pickItems = new Random();
        groceryItems = pickItems.nextInt(25);

    }

    public String getlast() {
        return lastName;
    }

    public String getFirst() {
        return firstName;
    }

    public int getItems() {
        return groceryItems;
    }

    public void display() {
        System.out.println("First Name: " + firstName + " Last Name: "
                + lastName + " Items Purchased: " + groceryItems);
    }

}

队列代码

public class Queue {

    private int maxSize;
    private int[] queArray;
    private int front;
    private int rear;
    private int nItems;

    public Queue(int s) {
        maxSize = s;
        queArray = new int[maxSize];
        front = 0;
        rear = -1;
        nItems = 0;
    }

    public void insert(int j) {
        if (rear == maxSize - 1)
            rear = -1;

        queArray[++rear] = j;
        nItems++;

    }

    public int remove() {
        int removed = queArray[front++];
        if (front == maxSize)
            front = 0;

        nItems--;

        return removed;
    }

    public int peek() {
        return queArray[front];
    }

    public boolean isEmpty() {
        return (nItems == 0);
    }

    public boolean isFull() {
        return (nItems == maxSize);
    }

    public int size() {
        return nItems;
    }

    public void display() {
        System.out.println("First Inserted Item to Last Inserted Item");

        if (rear < front && (!isEmpty())) {
            for (int i = front; i < maxSize; i++) {
                System.out.println(queArray[i]);
            }

            for (int i = 0; i <= rear; i++) {
                System.out.println(queArray[i]);
            }

        }

        else if (front >= rear && (!isEmpty())) {
            for (int i = front; i <= rear; i++) {
                System.out.println(queArray[i]);
            }
        }

        else {
            System.out.println("Queue is Empty!");
        }

    }

}

现在我想知道接下来我要创建什么?我只是在寻找指导或循序渐进的方法,因为它将帮助我学习。不是在寻找代码。我在想,既然我有一个客户类,我需要创建一个可以容纳每个客户的队列。我知道如何为简单的 int 或 char 队列编写代码,但我不清楚这个特定队列的要求是什么,因为它包含每个客户对象。

如果我在客户类代码中的任何地方有错误,请纠正我,如果有人可以为我提供下一阶段的步骤以及我应该做什么,我将不胜感激。

如果问题措辞不好,我很抱歉,因为我的英语不好,我确信如果我可以让这个小程序自己运行,我将对 java 和面向对象编程有更好的理解。

【问题讨论】:

  • 您需要开始完成问题的队列部分,添加将客户添加到队列(结帐通道)的功能,并添加将其从队列中移除的功能,并添加查看每个队列的状态。
  • 是的,我认为这是我需要的下一件事,只是对我必须制作什么样的队列感到困惑?到目前为止,我只编写了用于制作 int 类型队列的代码,我在其中添加了随机数。就我而言,我会将客户添加到队列中,所以我需要一个字符串队列吗?
  • 您很可能需要一个Customer 队列。
  • 我建议制作 lastfirst static
  • @user2733436 你可能想要一个 Deque,除非你需要编写自己的队列。

标签: java oop data-structures queue


【解决方案1】:

现在您应该添加不同的人员阵容(以模拟不同的结帐行)。所以我要做的是为您想要的每个结帐行创建一个队列。然后,正如问题所述,当一个键被按下时,它会创建一个新客户。客户需要弄清楚要走哪条线,因此可能会将其分配给总物品数量最少的那条(或者如果你想让它更容易,可以分配给总人数),并且更喜欢最接近的那条,比如左边,在多个最短队列的情况下。然后你需要让客户购买他们的物品然后离开。如果您决定要在按下按钮时执行此操作,正如问题所暗示的那样,您可以进行设置,以便每次按下该按钮时,您都会在每个客户中调用一个方法(仅在行,数组索引为 0),将他们的项目减一,并在达到零时从队列中删除客户对象,以模拟他们离开和另一个客户取而代之。现在你需要以某种方式向用户展示这些东西。也许只是一个简单的“[客户名称]加入了这条线。目前的排队是:第 1 行:2 人第 2 行:5 人”等,以及“[客户名称]在购买杂货后离开了这条线。”

我希望这是您想要的,希望对您有所帮助。

【讨论】:

  • 它要求我加入前一章的队列,我刚刚发布了队列的代码。但是我很困惑,因为队列是 int 类型,所以我将如何使用这个队列来存储客户?我要改变它的类型吗?
  • @user2733436 抱歉,我以为您使用的是 Java API 中的队列。您可以为每个客户分配一个特定的号码,然后使用它。
  • 这可能是解决这个问题的一个巧妙技巧,你能详细说明一下吗?
  • @user2733436 在 Customer 类的某处,创建一个公共 int,它应该对每个客户都是唯一的(每次创建客户时递增 1)。然后您可以在队列中使用该数字,并且当您需要从 Customer 类中获取某些内容时,您可以遍历您的 Customer 对象(可能存储在 ArrayList 中?)并找到需要的对象。这绝不是一种优雅的做事方式,但如果你想使用 Queue 类,我认为这将是一个很好的方式。
  • 我想我必须在客户类之外创建唯一编号 int 对吗?如果我在客户类中创建它,它将不起作用。感谢您的解释,我仍然不确定如何使用这种方法将客户添加到队列中......
【解决方案2】:

导入 java.util.Scanner; 导入 java.util.Random;

类 CirQueue { 私人的 int max,后,前; 诠释[]一个; 整数大小;

public
    CirQueue(int m) {
      max = m;
      size = 0;
      a = new int[m];
      rear = front = -1;
    }

    void insert(int val) {
        if(isFull()) {
            System.out.println("CUSTOMER CANNOT BE ADDED AS QUEUE IS FULL");
        } else {
            if(isEmpty()) {
                front = rear = 0;
                a[rear] = val;
            } else {
                rear = (rear+1)%max;
                a[rear] = val;
            }
            size++;
        }
    }

    int size() {
        return size;
    }

    void decFront(int rmv) {
        a[front]-=rmv;
        if (a[front] <= 0) {
            delete();
        }
    }
    
    void display() {
        if(!isEmpty()) {
            int i;
            for(i=front; i!=rear; i=(i+1)%max) {
                System.out.print(a[i] + " ");
            }
            System.out.print(a[i] + " ");
        }
        System.out.println();
    }

    boolean isFull() {
        if(front == (rear+1)%max) return true;
        else return false;
    }

    boolean isEmpty() {
        if(size == 0)  return true;
        else return false;
    }

    int delete() {
        if(isEmpty()) {
            System.out.println("Underflow");
            return -1;
        } else {
            int temp = a[front];
            if(rear==front) {
                rear = -1;
                front = -1;
            } else {
                front = (front+1)%max;
            }
            size--;
            return temp;            }
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-04
    • 2021-06-28
    • 2019-11-26
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 2018-09-18
    相关资源
    最近更新 更多