当前位置: 首页 > 知识库问答 >
问题:

Java值更新时如何维护arraylist中扫描对象的顺序

蓬长恨
2023-03-14

我有一个包含病人姓名和紧急级别的类,实现了可比较的:

class Patient implements Comparable<Patient>{
    private String name;
    private int emergencyLvl;

    public Patient(String name, int emergencyLvl)
    {
        this.name = name;
        this.emergencyLvl = emergencyLvl;

    }

    public String getName(){
        return this.name;

    }
    public int getEmergencyLvl(){
        return this.emergencyLvl;

    }
    public  void  setEmergencyLvl(int updateLvl){
        this.emergencyLvl = updateLvl;

    }
    public void setName(String newName){
        this.name = newName;

    }
    public int compareTo(Patient p){

        int compareEmergency = ((Patient) p).getEmergencyLvl();

        return compareEmergency - this.emergencyLvl;

    **//I believe my error comes from here**




        }
}

**假设这是我的输入文件:

3
0 david 30
0 may 60
1 david 30
2

*3=查询数,0=要添加到arraylist中的新患者,1=更新紧急级别(示例30+30=60)。2=按降序和名称打印紧急级别。**

然而,我的程序成功地扫描并向arraylist中添加了新的病人,但每当需要更新紧急级别时,序列都是错误的。

例如,在david紧急级别更新之前,序列是(david 60,david 30),但是在david紧急级别更新之后,由于david首先到达,因此正确的序列应该是(david 60,May60)。

不幸的是,我没有正确更新序列。下面是我的主要程序:

UpdateEmergencyLVL:

void UpdateEmergencyLvl(String patientName, int incEmergencyLvl) {

        for(Patient p: a1){
            if(p.getName().equals(patientName)){
                int newEmergencyLvl = p.getEmergencyLvl() +
                incEmergencyLvl;
                p.setEmergencyLvl(newEmergencyLvl);

                }

            }

            Collections.sort(a1);

    }

共有1个答案

元俊雅
2023-03-14

首先,您需要为类Patient添加一个新属性,您的新public Patient应该如下所示:

public Patient(String name, int emergencyLvl, int patIndx)
        {
            this.name = name;
            this.emergencyLvl = emergencyLvl;
            this.patIndx = patIndx;

        }

完成此操作后,为索引创建一个getter;在您的阅读方法中,您可以在这个索引中添加一个int。对于compare方法,由于到达索引比共享相同的emergencyLvl更重要,所以我会做如下操作:

public int compareTo(Patient p){

        int compareEmergency = ((Patient) p).getEmergencyLvl();

        int aux= compareEmergency - this.emergencyLvl;

        int compareIndex= ((Patient) p).getIndex();
        if(compareIndex>this.patIndx) aux=compareIndex-this.patIndx;
        return aux;    



        }

使用的扫描仪:

 void run() throws Exception {


    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    PrintWriter pr = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
    int numCMD = Integer.parseInt(br.readLine()); // note that numCMD is >= N
    int index=0;//starting index at 0
    while (numCMD-- > 0) {
      StringTokenizer st = new StringTokenizer(br.readLine());
      index++;
      int command = Integer.parseInt(st.nextToken());
      switch (command) {
        case 0: ArriveAtHospital(st.nextToken(), Integer.parseInt(st.nextToken())); 
               // you will need a index setter for this, assuming this is the moment when you add the patient to the patient list:
               ArriveAtHospìtalOrder(index);//as I cant see how the method ArriveAtHospital works, I showed you a possible method that takes the index.
               break;
        case 1: UpdateEmergencyLvl(st.nextToken(), Integer.parseInt(st.nextToken())); break;

        case 3: pr.println(Query()); break;
      }


    }
    pr.close();

这是一种可能的方法,ArriveAtHospitalIndex只是为了说明,因为我不知道您如何将参数传递给ArriveAtHospital方法,这只是为了让您知道应该在什么时候传递索引。你对台词有一点评论。

 类似资料:
  • 问题内容: 我正在使用JSONObject来删除JSON字符串中不需要的certin属性: 它可以正常工作,但是问题是JSONObject是“名称/值对的无序集合”,我想保持String在通过JSONObject操作之前的原始顺序。 任何想法如何做到这一点? 问题答案: 你不能 这就是为什么我们称其 为名称/值对的无序集合 。 我不确定为什么需要这样做。但是,如果要订购,则必须使用json数组。

  • 我有一个ArrayList,里面有一堆MyObject对象。我想在我的对象中保留一个整数字段,它是ArrayList中这个对象的键,这样我就可以很容易地得到这个元素在ArrayList中的位置。 当我从这个ArrayList中删除一个对象时,会出现问题,因为索引会向左移动。避免这个问题的最佳方法是什么? 我应该不删除元素,而是用null覆盖它们(这样索引就不会移位),还是应该在删除一次之后遍历Ar

  • Navicat 为维护 MongoDB 对象提供完整的解决方案。 在主窗口的导航窗格中或对象选项卡中选择对象。 右击已选择的对象。 选择“维护”,然后从弹出式菜单中选择一个维护选项。 结果显示在弹出的窗口中。 数据库 选项 描述 修复数据库 通过放弃无效或损坏的数据来重新生成数据库和索引。 集合 选项 描述 压缩集合 对集合中的所有数据和索引进行重写和碎片整理。 验证集合 通过扫描集合的数据和索引

  • Navicat 为维护 SQLite 对象提供完整的解决方案。 在主窗口的导航窗格中或对象选项卡中选择对象。 右击已选择的对象。 选择“维护”,然后从弹出式菜单中选择一个维护选项。 结果显示在弹出的窗口中。 数据库 选项 描述 分析数据库 收集有关数据库的统计数据。 真空数据库 重新生成数据库文件。它只适用于 main 数据库。 重新生成数据库索引 删除并重新生成数据库内的所有索引。 表 选项 描

  • Navicat 为维护 SQL Server 对象提供完整的解决方案。 在主窗口的导航窗格中或对象选项卡中选择对象。 右击已选择的对象。 选择“维护”,然后从弹出式菜单中选择一个维护选项。 结果显示在弹出的窗口中。 数据库 选项 描述 读写 将数据库设置为读写模式。 只读 将数据库设置为只读模式。 在线 使数据库在线。 离线 使数据库离线。 紧急 将数据库设置为紧急状态。 多个用户 将数据库设置为

  • Navicat 为维护 PostgreSQL 对象提供完整的解决方案。 在主窗口的导航窗格中或对象选项卡中选择对象。 右击已选择的对象。 选择“维护”,然后从弹出式菜单中选择一个维护选项。 结果显示在弹出的窗口中。 数据库 选项 描述 允许 用户可以连接到数据库。 不允许 没有用户可以连接到数据库。 分析数据库 收集关于数据库的统计数据。 真空数据库 垃圾收集并根据需要分析数据库。 重新生成数据库