#java #arrays #hash #hashmap
#java #массивы #хэш #hashmap
Вопрос:
Я пытаюсь создать базу HashMap
данных, содержащую имя и вес динозавров. Я хочу установить ограничение по весу printMatchingDinos()
для метода таким образом, чтобы печатались только динозавры с весом, меньшим или равным пределу.
public class DinoDatabase {
private HashMap<String, Integer> listOfDinos = new HashMap<>();
private String name;
private int weight;
public DinoDatabase() {
Map<String, Integer> listOfDinos = new HashMap<String, Integer>();
this.name = name; // Dino's name
this.weight = weight; // Dino's weight
}
// Add dino to the database
public void addDino(String name, int weight) {
if (!listOfDinos.containsKey(name)) {
listOfDinos.put(name, weight);
System.out.println(name " added. Weight: " weight "kg");
}
else {
System.out.println(name " cannot be added. It is already in the database!");
}
}
// Print Dino which has a weight less than or equals to the limit
public void printMatchingDinos(int limit) {
if (weight > limit) {
listOfDinos.remove(name, weight);
for (String name : listOfDinos.keySet()) {
System.out.println(listOfDinos.get(name));
}
}
else {
System.out.println("No Dino with given standard");
}
}
public static void main(String[] args) {
DinoDatabase db = new DinoDatabase();
db.addDino("Dravidosaurus", 907);
db.addDino("Eouplocephalus", 3175);
db.addDino("Tyrex", 1000);
db.printMatchingDinos(1000);
}
}
/* Output:
Dravidosaurus added. Weight: 907kg
Eouplocephalus added. Weight: 3175kg
Tyrex added. Weight: 1000kg
No Dino with given standard */
Ожидаемый результат
Dravidosaurus added. Weight: 907kg
Tyrex added. Weight: 1000kg
Комментарии:
1. Что такое
name
иweight
базы данных, в отличие от отдельного Dino?2. Разве вам не нужно проверять вес каждого динозавра по отдельности ?
3. Да, это относится к отдельному динозавру. Каждый Dino с весом меньше или равен limit должен быть напечатан
4. Но вы также определили вес и имя для базы данных в целом и используете этот вес
PrintMatchingDions
..
Ответ №1:
Вы, кажется, довольно смущены тем, что должен представлять этот класс.
В вашем классе есть как a name
, так и weight
field , поэтому, по-видимому, DinoDatabase
экземпляр представляет одного динозавра. Тем не менее, у него также есть карта, которая сопоставляет имена с весами, поэтому она также представляет концепцию базы данных dino.
Это не имеет смысла.
Вероятно, здесь должно быть два класса: public class Dino {String name; int weight; }
и public class DinoDatabase { Map<String, Dino> dinos; }
. В совокупности это не имеет смысла и сильно сбивает вас с толку. Например, в вашем конструкторе вы пишете this.name = name;
, который ничего не делает, он присваивает поле name самому себе. Это имеет смысл только в том случае, если есть параметр с именем name
. Вам могло бы сойти с рук вообще не создавать Dino
класс и придерживаться a Map<String, Integer>
для ваших динозавров, но это означает, что вы намерены хранить только вес динозавров, и вы не можете удобно добавлять дополнительные свойства, например, в какую эпоху они были живы, или могли ли они летать или нет.
Учитывая, что вы используете hashmap, здесь нет DB smarts, которые вы можете применить; единственный способ найти всех динозавров, которые соответствуют определенному условию, если условие не является: «Чье имя в точности равно этой строке», — это перебрать всю карту и вернуть все совпадающие записи. Фактические базы данных умнее, поскольку вы можете добавить индекс, чтобы такие запросы могли выполняться быстро, даже если у вас миллионы динозавров, но для этого требуются концепции программирования, которые значительно сложнее, чем то, что происходит в этом коде. Я бы предположил, что цель этого упражнения — просто написать его просто и перебирать все dino, возвращая только те, которые соответствуют условию. Это означает, что вам нужно создать ArrayList
объект (или другую коллекцию по вашему выбору), выполнить цикл, добавить только совпадающие, а затем вернуть эту коллекцию.
Комментарии:
1.
printMatchingDinos
Метод уже проходит через БД; вы могли бы просто обернутьif
проверку веса.
Ответ №2:
В настоящее время printMatchingDinos
ничего не фильтруется. Вам не нужно ничего удалять, чтобы распечатать. Вы можете выполнить итерацию entrySet of listOfDinos
и просто поставить условие для фильтрации в цикле при печати.
public void printMatchingDinos(int limit) {
for (Map.Entry<String, Integer> entry : listOfDinos.entrySet()) {
if (entry.getValue() <= limit)
System.out.println(entry.getKey() "- Weight: " entry.getValue() "kg");
}
}
Хотя ваше требование не соответствует ожидаемому результату. Эти строки печатаются при addDino
вызове.
Предложение: лучше создать класс для Dino
с полем name
amp; weight
и DinoDatabase
может содержать HashMap пары Ключ-динозавр в качестве поля, где ключ однозначно идентифицирует каждого динозавра.