Сумма одинаковых чисел Java [закрыт]

163
26 ноября 2018, 06:10

Есть задача на Java (пока под консоль): Пользователю предлагается вводить числа в диапазоне от 1 до 100 до тех пор, пока не надоест. Когда пользователь выходит из программы, он видит на экране сумму одинаковых чисел.

Например:
1 нажато 10 раз
17 нажато 35 раз
63 нажато 12 раз
и т.д.

Как это реализовать? Как запомнить и вывести сумму?

Answer 1

Создайте класс обертку для HashMap с методом add(int number)

public class SumMap {
    private Map<Integer, Integer> hashMap = new HashMap<>();
    public void add(int number) {
        if (hashMap.containsKey(number)) {
            hashMap.put(number, hashMap.get(number) + 1);
        } else {
            hashMap.put(number, 1);
        }
    }
    public Map<Integer, Integer> getMap() {
        return hashMap;
    }
    public static void main(String[] args) {
        SumMap sumMap = new SumMap();
        sumMap.add(1);
        sumMap.add(2);
        sumMap.add(1);
        sumMap.add(1);
        sumMap.add(1);
        sumMap.add(2);
        sumMap.add(2);
        for (Map.Entry<Integer, Integer> entry : sumMap.getMap().entrySet()) {
            System.out.println("Number=" + entry.getKey() + ", Amount=" + entry.getValue());
        }
    }
}

Более элегантный add. Не такой простой на первый взгляд. Но если понять, то намного более красивый

public Integer add(int number) {
    return hashMap.put(number, hashMap.getOrDefault(number, 0) + 1);
}
Answer 2

У меня получилось такое решение:

 final Map<String, Integer> counts = new HashMap<>();
 BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
 String line;
 while (!"exit".equals(line = reader.readLine())) {
        Integer count = counts.getOrDefault(line, 0);
        counts.put(line, count + 1);
 }
counts.forEach((key, value) -> System.out.println(String.format("%s нажато %s раз", key, value)));
Answer 3

Создаем HashMap<Integer, Integer> - ключом будет число, значением - количество его нажатий. При каждом вводе числа проверять было ли оно уже введено, если да - то берем количество вводов, если нет - то ноль. Далее вставляем в HashMap пару с ключом и увеличенным на 1 прежним значением.

HashMap<Integer, Integer> data = new HashMap<>();
int num = // просим ввести число, получаем его
int val = data.containsKey(num) ? data.get(num) : 0;
data.put(num, val + 1);

При выходе выводим информацию:

for (int num : data.keySet()) {
    int val = data.get(num);
    System.out.println(num + " нажато " + val + " раз.");
}

Чтобы ключи выводились от меньшего числа к большему, а не вразноброс, можно использовать TreeMap вместо HashMap - он посмотрит на тип ключа - Integer в котором уже предусмотрен компаратор и будет сортировать пары по ключам.

READ ALSO
Для чего AccessType.FIELD и AccessType.PROPERTY в @Access?

Для чего AccessType.FIELD и AccessType.PROPERTY в @Access?

Для чего эти аннотации, и какие плюсы и минусы AccessTypeFIELD и AccessType

206
NotificationListenerService иногда перестает работать

NotificationListenerService иногда перестает работать

Не знаю при каких условиях, но иногда перестает работать мой сервис по отлову уведомленийВот код:

164
Чем можно заменить JavaFX

Чем можно заменить JavaFX

Прочитал о изменениях в java и немного испугалсяОдно из нововведений будет удаление JavaFX, как я понял удаление полное

183