Я не могу использовать org.json package
.
Проблема
Используйте метод HTTP GET
для получения информации из базы данных медицинских карт пациентов. Запрос https://jsonmock.hackerrank.com/api/medical_records
, чтобы найти все записи. Результат запроса разбит на страницы и может быть далее доступен путем добавления к строке запроса ?&page=num
, где num
- номер страницы.
Ответом от API является запрос JSON со следующими пятью полями :
page: the current page
per_page: the maximum number of results per page
total: the total number of records in the search result
total_pages: the total number of pages which must be queried to get all the results
data: an array of JSON objects that contain medical records
Поле данных в ответе содержит список медицинских карт со следующей схемой:
id
: уникальный идентификатор записи timestamp
: отметка времени создания записи (в UT C в виде миллисекунд) userId
: идентификатор пользователя, для которого была записана транзакция userName
: имя пациента / пользователя, для которого была записана транзакция userDob
: дата рождения пользователя в формате ДД-ММ-ГГГГ vitals
: объект, жизненные показатели пользователя vitals.bloodPressureDiastole
: диастолия c показания давления пользователя, мм рт.ст. vitals.bloodPressureSystole
: систоли c показания давления пользователя , мм рт. ст. vitals.pulse
: частота пульса пользователя, ударов в минуту - * 104 5 *: частота дыхания пользователя, количество вдохов в минуту
vitals.bodyTemperature
: температура тела пользователя, градусы Фаренгейта diagnosis.id
: идентификатор диагноза diagnosis.name
: название диагностированного состояния diagnosis.severity
: серьезность диагностированного состояния doctor
: объект, врач, который диагностировал состояние doctor.id
: идентификатор доктора, который диагностировал состояние doctor.name
: имя доктора, который диагностировал состояние meta
: объект, метаинформация пользователя meta.height
: текущий рост пользователя, сантиметров meta.weight
: текущий вес пользователя, фунтов
Получить все медицинские записи и фильтр на основе следующих критериев:
ageStart ≤ the age of the user at the time of the record creation timestamp ≤ ageEnd
Для пользователей, соответствующих первому criteria, bloodPressureDiastole - bloodPressureSystole > bpDiff
Функция Описание
Complete the function getRecordsByAgeGroup in the editor below.
getRecordsByAgeGroup has the following parameter(s):
int ageStart: the minimum age requirement (inclusive)
int ageEnd: the maximum age requirement (inclusive)
int bpDiff: the difference in systolic and diastolic pressures must be less than this value
Возвраты: int[]
: отсортированный массив идентификаторов записей, соответствующих вышеуказанным критериям. Если не найдено ни одной записи, вернуть [-1]
Ограничения:
0 ≤ ageStart, ageEnd, bpDiff ≤ 102
МОЙ КОД
import java.net.*;
import com.google.gson.*;
class Result {
/*
* Complete the 'getRecordsByAgeGroup' function below.
*
* The function is expected to return an INTEGER_ARRAY.
* The function accepts following parameters:
* 1. INTEGER ageStart
* 2. INTEGER ageEnd
* 3. INTEGER bpDiff
*
* https://jsonmock.hackerrank.com/api/medical_records
*/
public static List<Integer> getRecordsByAgeGroup(int ageStart, int ageEnd, int bpDiff) {
int startPage = 1;
int totalPages = 10;
String response;
ArrayList<Integer> ids = new ArrayList<>();
ArrayList<Long> times = new ArrayList<>();
List<String> dobs = new ArrayList<>();
ArrayList<Integer> bpd = new ArrayList<>();
ArrayList<Integer> bps = new ArrayList<>();
ArrayList<Integer> results = new ArrayList<>();
while (startPage <= totalPages) {
try{
URL obj = new URL ("https://jsonmock.hackerrank.com/api/medical_records?&page=" + startPage);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
while ((response = in.readLine()) != null) {
JsonObject convertedObject = new Gson().fromJson(response, JsonObject.class);
totalPages = convertedObject.get("total_pages").getAsInt();
JsonArray data = convertedObject.getAsJsonArray("data");
for (int i = 0; i < data.size(); i++){
System.out.println(data.get(i));
int id = data.get(i).getAsJsonObject().get("id").getAsInt();
ids.add(id);
Long ts = data.get(i).getAsJsonObject().get("timestamp").getAsLong();
times.add(ts);
String birth = data.get(i).getAsJsonObject().get("userDob").getAsString();
dobs.add(birth);
Необходимо получить доступ к "жизненно важным" элементам - ниже моя попытка
JsonParser jsonParser = new JsonParser();
JsonObject vitals = jsonParser.parse(json)
.data.get(i).getAsJsonObject().get("vitals");
int bpdy = vitals.get("bloodPressureDiastole").getAsInt();
//JsonArray vitals = data.get(i).getAsJsonArray("vitals");
//int bpdy = data.get(i).getAsJsonArray("vitals").getAsJsonObject().get("bloodPressureDiastole").getAsInt();
// bpd.add(bpdy);
//int bpsy = data.get(i).getAsJsonObject("vitals").getAsJsonObjectAsJsonObject("bloodPressureSystole").getAsInt();
//int bpsy=data.get(i).getAsJsonObject("vitals").getAsJsonObject().get("bloodPressureSystole").getAsInt();
//bps.add(bpsy);
}
}
in.close();
startPage++;
}
catch (Exception ex){
ex.printStackTrace();
}
}
//current age
for (int i = 0; i < dobs.size(); i++){
SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy");
try{
Date dobform = format.parse(dobs.get(i));
//utc date
Date date = new Date(times.get(i));
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy", Locale.ENGLISH);
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
String tsform = sdf.format(date);
Date tsformcom = format.parse(tsform);
int userage = calculateAgeWithJava7(dobform, tsformcom);
if ((userage==ageStart|| userage>ageStart) & (userage==ageEnd || userage<ageEnd)){
int actualbpdiff=bpd.get(i)-bps.get(i);
if (actualbpdiff > bpDiff){
results.add(ids.get(i));
}
}
}catch (Exception ex) {
ex.printStackTrace();
}
}
return results;
}
public static int calculateAgeWithJava7(
Date birthDate,
Date currentDate) {
DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
int d1 = Integer.parseInt(formatter.format(birthDate));
int d2 = Integer.parseInt(formatter.format(currentDate));
int age = (d2 - d1) / 10000;
return age;
}
}