简体   繁体   中英

Why can't I access TreeMap declared in a class from another with get method

I'm doing an uni project about a computer system intended to be used in an hospital.

I have the class "Patient" with some parameters, like heart beat, blood pressure (2 values) and temperature, associated to it, that are stored in the TreeMap "parameters": every parameter is stored with the time when it is measured. They are updated with the method updateParameters() of "Patient".

In updateParameters() I've tried to use the method printParameters() to check if they are stored correctly and they are.

I have then a class "ViewParameters" that needs access to the parameters of a patient, but the problem is that it doesn't get access to those parameters.

I have tried to print the patient and it is exactly the patient selected, so when i use the methods getParameters() or printParameters() of that patient I'm using the right methods.

But:

(I've inserted some comments in the code of "ViewParameters" with the numbers of this list)

  1. When I do patient.printParameters() it prints nothing, just the initial line ("patient parameters:\\n").

  2. When I try to print directly from patient.getParameters(), it prints nothing.

  3. If I print the parameters in "ViewParameters" class after using method getParameters() it prints nothing, just the initial line ("parameters in viewParameters\\n").

  4. Even if I directly accessed the parameters with parametres = patient.getParameters() and then try to print them, it prints nothing, just the initial line ("parameters in viewParameters").

  5. I've tried to put parameters in "Patient" public and do parameters (in "ViewParameters) = parameters (in "Patient") but it does nothing.

"Patient" class:

public class Patient implements Comparable<Object> {

private String code;
public Map<LocalTime, Integer[]> parameters = new TreeMap<>();


public Map<LocalTime, Integer[]> getParameters() {

    return parameters;
}

public void printParameters() {
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm");

    String patient = "patient parameters\n";
    for(LocalTime time: parameters.keySet()) {
        patient += time.format(dtf)  + " ";
        for(Integer parameter: parameters.get(time)) 
            if(parameter == null)
                patient += "- ";
            else
                patient += parameter + " ";
    }
    System.out.println(patient);


}


public void updateParameters(Map<LocalTime, Integer[]> parameters) {

    for(LocalTime time: parameters.keySet()) {
        Integer[] parametersInteger = new Integer[4];
        int i = 0;
        for(Integer parameter: parameters.get(time)) {
            parametersInteger[i] = parameter;
            i++;
        }
        this.parameters.put(time, parametersInteger);

    }

    printParameters();


}

"ViewParameters" class:

public class ViewParameters extends AbstractTableModel {

String[] column = new String[5];  
Map<LocalTime, Integer[]> parameters = new TreeMap<>();
private Patient patient;

public ViewParameters(String[] tags, Patient patient) {
    int i = 0;
    for(String tag: tags) {
        column[i] = tag;
        i++;
    }
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH.mm");

    this.patient=patient;
    System.out.println("patient in ViewParameters:" + patient);



    patient.printParameters(); //1)


             //2)
    for(LocalTime time: patient.getParameters().keySet()) {
        System.out.println("time: " + time);
        Integer[] parametersInteger = new Integer[4];
        int j = 0;
        for(Integer parameter: patient.getParameters().get(time)) {
            System.out.println("parametro " + j + ": " + parameter);
            parametersInteger[j] = parameter;
            j++;
        }
        parameters.put(time, parametersInteger);
    }


            //3)
    String print = "parameters in viewParameters\n";
    for(LocalTime time1: parameters.keySet()) {
        print += time1 + " ";
        for(Integer parameter: parameters.get(time1)) 
            if(parameter == null)
                print += "- ";
            else
                print += parameters + " ";
    }
    System.out.println(print);


            //4)
    parameters = patient.getParameters(); 


    String print1 = "parameters in viewParameters";
    for(LocalTime time: parameters.keySet()) {
        print1 += time + " ";
        for(Integer parameter: parameters.get(time)) 
            if(parameter == null)
                print1 += "- ";
            else
                print1 += parameter + " ";
    }
    System.out.println(print1);

}

The problem seem to be in the use of Patient's methods outside its own class, because printParameters() works if I use it in "Patient", doesn't if I use it in "ViewParameters" and even the getParameters() method doesn't work in "ViewParameters".

Here is a working example on how to call the printParameters() method of Patient from outside Patient. Probably the Patient you pass to the constructor in ViewParameters has got an empty parameters map. You can check the map with isEmpty() method.

import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Map;
import java.util.TreeMap;

public class Patient implements Comparable<Patient>
{
    private Map<LocalTime, Integer[]> parameters = new TreeMap<>();

    public Map<LocalTime, Integer[]> getParameters()
    {
        return parameters;
    }

    public void printParameters()
    {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm:ss");

        StringBuilder patientParameters = new StringBuilder();
        patientParameters.append("patient parameters\n");

        for (LocalTime time : parameters.keySet()) 
        {
            patientParameters.append(time.format(dtf) + " ");
            for (Integer parameter : parameters.get(time))
            {
                if (parameter == null)
                {
                    patientParameters.append("- ");
                }
                else
                {
                    patientParameters.append(parameter + " ");
                }
            }
            patientParameters.append("\n");
        }
        patientParameters.append("============END==========\n");
        System.out.println(patientParameters);
    }

    public void updateParameters(Map<LocalTime, Integer[]> parameters)
    {
        this.parameters.putAll(parameters);
    }

    @Override
    public int compareTo(Patient otherPatient)
    {
        // TODO Auto-generated method stub
        return 0;
    }
}

AND

import java.time.LocalTime;
import java.util.Map;
import java.util.Random;
import java.util.TreeMap;

public class Main
{
    private static Random generator = new Random();
    public static void main(String[] args)
    {
        Patient patient = new Patient();
        System.out.println("contains no parameters? " + patient.getParameters().isEmpty());
        patient.printParameters();
        patient.updateParameters(messureNewParameters());
        System.out.println("contains no parameters? " + patient.getParameters().isEmpty());
        patient.printParameters();
        try 
        {
            Thread.sleep(1000);
        }
        catch (InterruptedException e)
        {

        }
        patient.updateParameters(messureNewParameters());
        patient.printParameters();
    }

    private static Map<LocalTime, Integer[]> messureNewParameters()
    {
        Map<LocalTime, Integer[]> parameters = new TreeMap<>();
        Integer[] values = new Integer[4];
        for (int i = 0; i < values.length; i++)
        {
            values[i] = getNewValue();
        }
        parameters.put(LocalTime.now(), values);
        return parameters;
    }

    private static Integer getNewValue()
    {
        Integer result = generator.nextInt(120);
        if(result < 50)
        {
            return null;
        }
        return result;
    }
}

Here are a few suggestions:

I'd create an Observation class that encapsulates the name and value and, best of all, units into a single immutable object. See Martin Fowler "Analysis Patterns" .

Each patient should have a private data structure. Add convenience methods to allow you to add an observation to a Patient.

Would a Chart class help? Maybe it would encapsulate useful things. A Patient could have a Chart that way. It maps well to how I understand hospitals.

Don't have a separate ViewParameters class to display the observations. Put that method inside Patient or Chart . Don't have a printParameters method; write a proper toString override.

Don't be so quick to give access to private data.

Prefer immutable data.

Here's how I might write it:

Observation:

import java.time.LocalDateTime;

public class Observation {

    private final LocalDateTime dateTime;
    private final String name;
    private final String value;
    private final String units;

    public Observation(String name, String value, String units) {
        if ((name == null) || (name.trim().length() == 0) ) throw new IllegalArgumentException("observation name cannot be blank or null");
        if (value == null) throw new IllegalArgumentException("value cannot be null");
        this.dateTime = LocalDateTime.now();
        this.name = name;
        this.value = value;
        this.units = (units != null) ? units.trim() : "";
    }

    public LocalDateTime getDateTime() {
        return dateTime;
    }

    public String getName() {
        return name;
    }

    public String getValue() {
        return value;
    }

    public String getUnits() {
        return units;
    }

    @Override
    public String toString() {
        final StringBuffer sb = new StringBuffer("Observation{");
        sb.append("dateTime=").append(dateTime);
        sb.append(", name='").append(name).append('\'');
        sb.append(", value='").append(value).append('\'');
        sb.append(", units='").append(units).append('\'');
        sb.append('}');
        return sb.toString();
    }
}

Patient:

import java.util.ArrayList;
import java.util.List;

public class Patient {

    private String name;
    private List<Observation> chart;

    public Patient(String name) {
        if ((name == null) || (name.trim().length() == 0)) throw new IllegalArgumentException("name cannot be blank or null");
        this.name = name;
        this.chart = new ArrayList<>();
    }

    public String getName() {
        return name;
    }

    public void addObservation(Observation observation) {
        if (observation != null)  {
            this.chart.add(observation);
        }
    }

    @Override
    public String toString() {
        final StringBuffer sb = new StringBuffer("Patient{");
        sb.append("name='").append(name).append('\'');
        sb.append(", chart=").append(chart);
        sb.append('}');
        return sb.toString();
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM