Задача на выбор коллекции
Подскажите. (код - индекс массы тела) Как организовать через LinkedList ?
public class BMIColletction {
LinkedList<Float> limits;
HashMap<Float, String> messages;
public BMIColletction() {
limits = new LinkedList<>();
messages = new HashMap<>();
}
void addNewParam(float limit, String message) {
limits.add(limit);
messages.put(limit, message);
}
public static void main(String[] args) {
BMIColletction bmicol = new BMIColletction();
bmicol.addNewParam(16.0f, "Выраженный дефицит массы тела");
bmicol.addNewParam(30.0f, "Избыточная масса тела (предожирение)");
bmicol.addNewParam(40.0f, "Очень резкое ожирение");
System.out.println(bmicol.messages);
System.out.println(bmicol.limits);
System.out.println(bmicol.checkIndex(35));
}
String checkIndex(double x) {
for (Float limit : limits) {
if (between(x, this.prev, this.next))
//непонятное место
}
}
static boolean between(double x, double from, double to) {
return (x > from) && (x <= to);
}
}
// if (between(bmi, Double.MIN_VALUE, 16.0f))
// result = "Выраженный дефицит массы тела";
// else if (between(bmi, 16.0f, 18.5f))
// result = "Недостаточная (дефицит) масса тела";
// else if (between(bmi, 18.5f, 25.0f))
// result = "Норма";
// else if (between(bmi, 25.0f, 30.0f))
// result = "Избыточная масса тела (предожирение)";
// else if (between(bmi, 30.0f, 35.0f))
// result = "Ожирение";
// else if (between(bmi, 35.0f, 40.0f))
// result = "Ожирение резкое";
// else if (between(bmi, 40.0f, Double.MAX_VALUE))
// result = "Очень резкое ожирение";
Вопрос: Пытаюсь проверить некоторый элемент на его место в linkedList, с помощью next/prev. Как это сделать? Т.е. какими командами/полями оперировать ? Вроде есть вложенный класс Node, но этот момент не очень понятен.
Ответы (1 шт):
Насколько я понял, в вашем случае это не совсем диапазон. Точнее диапазон специфический. Его особенность состоит в том, что это по сути шкала, разделенная на части. Это упрощает задачу. Полагаю, что в данном случае вам вполне подойдет обычная коллекция типа ключ - значение. Использовать ее придется нетипично, ведь искать нужно будет итератором, но в силу того, что в коллекция не будет содержать большого количества элементов, это не имеет большого значения. Я создал экземпляр класса Properties прямо в методе main, разумеется, это только для демонстрации. Вам предстоит вынести это в файл свойств, подгрузить его и передать в конструктор класса (можно добавить метод для загрузки свойст).
import java.util.Map;
import java.util.Properties;
import java.util.TreeMap;
import java.util.stream.Collectors;
public class BmiEstimation {
private final Map<Integer, String> bmiMap;
public BmiEstimation(Properties properties) {
this.bmiMap = properties.entrySet().stream()
.collect(Collectors.toMap(
k->convertBmi(Double.valueOf(k.getKey().toString())),
v->String.valueOf(v.getValue()),
(o1, o2) -> o1, TreeMap::new));
}
public String bmiInterpretation(double bmi) {
final Integer bmiInt = convertBmi(bmi);
for (Integer bmiKey : bmiMap.keySet()) {
if (bmiKey > bmiInt) return bmiMap.get(bmiKey);
}
return "ERROR";
}
private Integer convertBmi(double bmi){
return (int) bmi * 10;
}
public static void main(String[] args) {
//Properties лучше загрузить из файла-свойств порядок данных не имеет значения, что обеспечивается конструктором
Properties prop = new Properties();
prop.put(16.0, "Выраженный дефицит массы тела");
prop.put(25.0, "Норма");
prop.put(18.5, "Недостаточная (дефицит) масса тела");
BmiEstimation bmiEstimation = new BmiEstimation(prop);
System.out.println(bmiEstimation.bmiInterpretation(17));
}
}