为什么我不能使用get方法访问另一个类中声明的TreeMap

时间:2019-08-16 14:17:33

标签: java swing class scope treemap

我正在做一个关于打算在医院中使用的计算机系统的uni项目。

我有一个“ Patient”类,其中包含一些与之相关的参数,例如心跳,血压(2个值)和温度,这些参数存储在TreeMap的“ parameters”中:每个参数随其存储的时间一起存储被测量。使用“患者”的updateParameters()方法对其进行更新。

在updateParameters()中,我尝试使用方法printParameters()来检查它们是否正确存储,以及它们是否正确存储。

然后我有了一个“ ViewParameters”类,该类需要访问患者的参数,但是问题是它无法访问那些参数。

我已经尝试打印患者,而这正是所选择的患者,所以当我使用该患者的getParameters()或printParameters()方法时,我使用的是正确的方法。

但是:

(我在“ ViewParameters”的代码中插入了带有此列表编号的注释)

  1. 当我执行Patient.printParameters()时,它什么也不打印,仅打印第一行(“患者参数:\ n”)。

  2. 当我尝试直接从Patient.getParameters()打印时,它什么也不打印。

  3. 如果使用方法getParameters()后在“ ViewParameters”类中打印参数,它什么也不会打印,仅打印第一行(“ viewParameters \ n中的参数”)。

  4. 即使我直接使用parametres = Patient.getParameters()访问参数,然后尝试打印它们,也不会打印任何内容,仅打印第一行(“ viewParameters中的参数”)。

  5. 我尝试将参数公开放置在“患者”中,并执行参数(在“ ViewParameters”中)=参数(在“患者”中),但是它什么也没做。

“患者”类别:

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”类:

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

}

问题似乎出在类本身之外使用Patient的方法,因为如果我在“患者”中使用它,printParameters()会起作用,如果我在“ ViewParameters”甚至getParameters()中使用它,那不会起作用方法在“ ViewParameters”中不起作用。

2 个答案:

答案 0 :(得分:2)

这是一个如何从外部Patient调用Patient的printParameters()方法的有效示例。您在ViewParameters中传递给构造函数的Patient可能有一个空的参数映射。您可以使用isEmpty()方法检查地图。

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

答案 1 :(得分:1)

以下是一些建议:

我将创建一个Observation类,将名称和值以及最好的单位封装到一个不可变的对象中。参见Martin Fowler "Analysis Patterns"

每个患者都应具有私有数据结构。添加便捷方法,使您可以向患者添加观察结果。

<xsl:param as="xs:string" name="json"><!CDATA[[{ "results": [ { "id": "750584f1-ce77-4e55-92b4-aae0c0ac37ae", "profileId": "4aebb5de-5461-425c-b75e-959cef17048b", "_embedded": { "notes": { "results": [ { "content": "<div>General notes<div>" }, { "content": "General notes" } ], "paging": { "pageNumber": 1, "pageSize": 20, "totalCount": 2 } } } }, { "id": "750584f1-ce77-4e55-92b4-aae0c0ac37ae", "profileId": "4aebb5de-5461-425c-b75e-959cef17048b", "_embedded": { "notes": { "results": [ { "content": "General notes" }, { "content": "General notes" } ], "paging": { "pageNumber": 1, "pageSize": 20, "totalCount": 2 } } } ] }] ]]></xsl:param> 类的帮助吗?也许它将封装有用的东西。这样Chart可以有一个Patient。它很好地反映了我对医院的了解。

没有单独的Chart类来显示观察结果。将该方法放入ViewParametersPatient中。没有Chart方法;编写适当的printParameters覆盖。

不要那么快就可以访问私有数据。

首选不可变数据。

这是我的写法:

观察:

toString

患者:

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