仅当时间在插入点之前或之后 10 分钟时,如何将日期时间 hh:mm 插入按时间排序的数组列表中

问题描述

对于我在 Java9 中的第一个开发项目,我有一个问题。 我需要在 ArrayList 中插入一个包含一些信息和日期类型的对象 仅当时间不存在于 ArrayList 中并且它遵守 ArrayList 中的每个时间必须每 10 分钟存储一次的条件时。

所以,例如这个想法是这样的:

正确[21:10,21:20,21:50,22:00],

不正确[21:05,21:10,21:55,22:00]

我尝试这样的事情:

 private static ArrayList<Order> orders = new ArrayList<Order>();
    //ordinazione = orderTime,name,surname,adderess,pizze;
    public Pizzeria() {
       Order ord = new Order(name,address,num_pizze);
       isValid(ord);
    }
    private void isValid(Order ord) {
                boolean valid = false;
                long prew,current;
                long add = ord.getorderTime().getTime();
                int min10 = 10*60*1000; //10 minutes
                if(orders.size() == 0) {
                    addOrder(ord);
                }else if(orders.size() == 1){
                    current = orders.get(0).getorderTime().getTime() / 1000;
                    if(add > current) {
                        if(add - current >= min10) {
                            valid = true;
                            addOrder(order);
                        }
                    }else{
                        if(current - add >= min10) {
                            valid = true;
                            addOrder(ord);
                        }
                    }
                }else{
                    int i = 0;  
                      while (orders.size() > i) {
                          prec =  i > 1 ? orders.get(i-1).getorderTime().getTime() / 1000 : 0;
                          current = orders.get(i).getorderTime().getTime() / 1000;
                          if (current - add >= min10 && add - prec >= min10) {
                              valid = true;
                              addOrder(ord);
                              break;
                          }
                          i++;
                      }
                }
                
                if(!valid) {
                    System.out.println("this time is not allowed!");
                }
            }
        
            public void addOrder(Orderd ord) {
                orders.add(ord);
            }

有什么建议吗?

解决方法

这可能不是最漂亮的解决方案,但它非常简单:每天每 10 分钟为一个订单分配一个带有插槽的数组。

首先我们需要订单数组:

<class 'float'>
<class 'float'>
<class 'float'>
<class 'float'>
<class 'float'>

现在将新订单放入订单的方法可能如下:

/** Accept an order every 10 minutes */
private static final int SLOT_SIZE_MINUTES = 10;

private Order[] orders
        = new Order[Math.toIntExact(Duration.ofDays(1).toMinutes()) / SLOT_SIZE_MINUTES];

我的方法的作用:它尝试根据订单中已有的订单时间将订单放入正确的 10 分钟时段,将时间截断为 10 分钟时段。如果插槽已经被占用,它会使用循环溢出查看下一个插槽。如果所尝试的两个时隙中的任何一个是空的,它会将顺序时间设置为找到的时隙的适当时间。这也是确保时间为整点 10 分钟的原因:21:00、21:10 等,而不是 21:05。

链接

https://github.com/nodejs/node/pull/36811 解释如何使用 java.time。