【问题标题】:Java ArrayList removeAllJava ArrayList removeAll
【发布时间】:2021-12-16 17:54:12
【问题描述】:

我正在研究一个虚拟医院数据库。我有一个ArrayList,它结合了医生理论上可以预约的所有可能时间,还有一个ArrayList,它持有实际的注册预约。

Availability {
  int doctorid;
  String specialty;
  Date date;
  int order_of_appointment;
}
//////////

ArrayList<Availability> allTimes;

ArrayList<Availability> busyTimes;

我想要完成的是找到医生空闲的时间。这是 (allTimes - busyTimes) 的结果

我尝试使用allTimes.removeAll(busyTimes),但没有删除任何内容。

我确保我覆盖了 Availability 类中的 equals() 方法,但它仍然没有删除任何内容。

@Override
public boolean equals(Object o) {
  if (this == o) return true;
  if (!(o instanceof Availability)) return false;   
  Availability that = (Availability) o;
  return doctorid == that.doctorid &&
      order_of_appointment == that.order_of_appointment &&
      Objects.equals(specialty, that.specialty) &&
      Objects.equals(date, that.date);
} 

输出:

  1. busyTimes = [可用性{doctorid=1,专业='内科',日期=2021-11-02,order_of_appointment=2} ]

  2. 所有时间 = [可用性{doctorid=1,专业='内科',日期=2021-11-02,order_of_appointment=1} , 可用性{doctorid=1, special='内科', date=2021-11-02, order_of_appointment=2} , 可用性{doctorid=1,specialty='内科', date=2021-11-02, order_of_appointment=3}]

  3. 我为 freeTimes 获得的输出与 allTimes 相同,尽管我希望它会删除 order_of_appointment==2 的约会。

我完全不知道是什么原因造成的。任何帮助,将不胜感激。提前致谢!

【问题讨论】:

  • 你试过调试removeAll方法吗?
  • 还没有,我已经关闭了我的电脑,但是我要在早上醒来时运行 jdb。我发布了这个以防我遗漏了一些明显的东西
  • 很明显,你需要调试它:-)
  • 我认为问题可能是由变量date引起的。你确定他们在date 上是平等的吗?无论如何,调试它。
  • 您首先应该简单地测试一下您的 equla 方法是否符合您的预期。

标签: java arrays object arraylist


【解决方案1】:

问题在于,即使我将日期格式设置为“yyyy-MM-dd”,它仍然将时间存储在 Date 对象中。我将 Date 对象转换为字符串,然后比较字符串并且工作正常。谢谢大家。

【讨论】:

    【解决方案2】:

    您需要使用比较逻辑覆盖 可用性类 中的 equals(Object obj) 方法。

    我实现了它。请检查。

    import java.util.Date;
    
    public class Availability {
    
        private int doctorId;
        private String specialty;
        private Date date;
        private int orderOfAppointment;
    
        public Availability() {
            super();        
        }
    
        public Availability(int doctorId, String specialty, Date date, int orderOfAppointment) {
            super();
            this.doctorId = doctorId;
            this.specialty = specialty;
            this.date = date;
            this.orderOfAppointment = orderOfAppointment;
        }
    
        public int getDoctorId() {
            return doctorId;
        }
    
        public void setDoctorId(int doctorId) {
            this.doctorId = doctorId;
        }
    
        public String getSpecialty() {
            return specialty;
        }
    
        public void setSpecialty(String specialty) {
            this.specialty = specialty;
        }
    
        public Date getDate() {
            return date;
        }
    
        public void setDate(Date date) {
            this.date = date;
        }
    
        public int getOrderOfAppointment() {
            return orderOfAppointment;
        }
    
        public void setOrderOfAppointment(int orderOfAppointment) {
            this.orderOfAppointment = orderOfAppointment;
        }
    
        @Override
        public String toString() {
            return "Availability  [doctorId=" + doctorId + ", specialty=" + specialty + ", date=" + date
                    + ", orderOfAppointment=" + orderOfAppointment + "]";
        }
    
        @Override
        public boolean equals(Object obj) {
            boolean returnVal = false;
            Availability busyslote = (Availability) obj;
            if (this.doctorId == busyslote.doctorId && this.orderOfAppointment == busyslote.orderOfAppointment
                    && this.specialty.equalsIgnoreCase(busyslote.specialty) && this.date.equals(busyslote.date)) {
                returnVal = true;
            } else {
                returnVal = false;
            }
    
            return returnVal;
        }
    }
    
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    
    public class AppointmentMain {
    
        public static void main(String[] args) {
    
            List<Availability> allAppointment = new ArrayList<>();
            List<Availability> attenedAppointment = new ArrayList<>();
    
            Availability obj1 = new Availability(1, "Internal Medicine", new Date(), 1);
            Availability obj2 = new Availability(1, "Internal Medicine", new Date(), 2);
            Availability obj3 = new Availability(1, "Internal Medicine", new Date(), 3);
    
            allAppointment.add(obj1);
            allAppointment.add(obj2);
            allAppointment.add(obj3);
    
            Availability obj4 = new Availability(1, "Internal Medicine", new Date(), 3);
    
            attenedAppointment.add(obj4);
    
            System.out.println("Befour count :" + allAppointment.size());
            allAppointment.removeAll(attenedAppointment);
            System.out.println("After count :" + allAppointment.size());
        }
    }
    

    【讨论】:

    • 是的,我同意我的代码是样板代码,而且问题示例肯定是健壮的,但是有些新手觉得很难理解,这就是我这样写的原因。
    • 您的代码没有提供答案。该问题已经说明了equals方法的良好用法。
    • 你好@juwil 我更新了我的答案。请你再试一次。
    • 他重写了equals的方法,但是还是有问题,你的回答好像没有达到重点。
    【解决方案3】:

    你没有展示你是如何创建数组的,或者你是如何添加元素的。

    我用 ArrayLists 做了一个简单的程序,并按预期工作:

    import java.util.*;
    
    class A {
      int id;
      A(int id) {
        this.id = id;
      }
    
      @Override
      public boolean equals(Object o) {
        return o instanceof A && this.id == ((A)o).id;
      }
      public String toString() {
        return String.format("A{id:%s}", id);
      }
    
      public static void main(String ... args) {
        List<A> a = new ArrayList<A>(Arrays.asList(new A(1), new A(2)));
        List<A> b = new ArrayList<A>(Arrays.asList(new A(2), new A(3)));
        a.removeAll(b);
        System.out.println(a);
      }
    }
    

    输出:

    [A{id:1}]
    

    【讨论】:

      猜你喜欢
      • 2014-09-28
      • 1970-01-01
      • 1970-01-01
      • 2015-05-01
      • 1970-01-01
      • 2016-03-16
      • 2016-03-06
      • 2016-06-27
      • 2012-01-12
      相关资源
      最近更新 更多