【问题标题】:Java how to maintain sequence of scanned objects in an arraylist when values are updatedJava如何在更新值时维护arraylist中扫描对象的序列
【发布时间】:2017-01-26 10:45:04
【问题描述】:

我有一个包含患者姓名和紧急级别的类,可实现可比性:

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 = 新患者添加到数组列表中,1 = 更新紧急级别(例如 30 + 30 = 60)。 2 = 从降序和名称打印紧急级别。**

但是,我的程序成功地扫描并正确地将新患者添加到数组列表中,但是每当需要更新紧急级别时,顺序都是错误的。

例如更新david紧急级别之前。顺序是(may 60, david 30) 但是在更新大卫紧急级别后,因为大卫首先到达,所以可能正确的顺序应该是(大卫 60,5 月 60)。

很遗憾,我未能正确更新序列。 这是我的主程序:

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);

    }

【问题讨论】:

  • 无需在 compareTo 中将 p 转换为 Patient - 根据方法签名,它已经是 Patient
  • 是的,但这并不能解决我的问题,因为我想让首先进入的患者的顺序正确。因为在我的情况下,大卫是第一位的,但后来更新了紧急情况。但是,更新后的紧急级别与 5 月相同。但大卫先来,所以大卫应该先打印出来,而不是五月。
  • 也许添加一个到达索引可以避免这个问题。例如,获取输入文件的行作为索引。
  • 当 compareTo 返回 0 时,比较的两个元素的顺序保持不变。 - Collections.sort(List>) This sort is guaranteed to be stable: equal elements will not be reordered as a result of the sort.
  • 如果使用bufferedReader添加行,只需在bucle之前创建一个int,例如int index=0用于读取行,并在读取bucle中的每一行后执行index ++,然后将该索引添加到您对患者使用的信息中,添加一个新属性,例如,您有姓名和紧急状态,您可以添加一个新的arrivalIndx 属性来存储它。

标签: java sorting arraylist collections


【解决方案1】:

首先,您需要一个新的 Patient 类属性,您的新公共 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 方法,这只是为了让您知道何时应该传递索引。您对这些行有一点评论。

【讨论】:

    猜你喜欢
    • 2019-07-11
    • 2011-02-04
    • 1970-01-01
    • 2018-09-09
    • 2022-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    相关资源
    最近更新 更多