Как распечатать базу данных в HashMap, которая меньше или равна заданному пределу?

#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 Метод уже проходит через БД; вы могли бы просто обернуть print оператор в 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 пары Ключ-динозавр в качестве поля, где ключ однозначно идентифицирует каждого динозавра.