Как вернуть количество вызовов функций между вызовами с одним и тем же входом? - PullRequest
0 голосов
/ 15 февраля 2020

Я пытаюсь получить значение, когда функция в последний раз была вызвана с тем же входом. Если это первый раз, верните -1. Например:

System.out.println(newNumber(1)); // returns -1
System.out.println(newNumber(2)); // returns -1
System.out.println(newNumber(3)); // returns -1
System.out.println(newNumber(1)); // returns 2
System.out.println(newNumber(2)); // returns 2
System.out.println(newNumber(1)); // returns 1
System.out.println(newNumber(4)); // returns -1
System.out.println(newNumber(1)); // returns 1

Очень трудно найти правильный способ начать делать это. Я довольно новичок в ха sh картах, и я думаю, что это то, что вы должны использовать?

Ответы [ 4 ]

1 голос
/ 15 февраля 2020

Вы можете сохранить количество раз, когда число появляется на карте, от количества до количества раз, когда оно появляется. Обратите внимание, что эта карта должна быть членом данных, чтобы сохранить значения после одного вызова функции.

Map<Integer, Integer> map = new HashMap<>();
public int newNumber(int i) {
    Integer result = map.computeIfPresent(i, (k, v) -> v + 1);
    if (result == null) {
        map.put(i, 1);
        return -1;
    }
    return result;
}
0 голосов
/ 15 февраля 2020

Вы можете сделать это следующим образом:

import java.util.HashMap;
import java.util.Map;

public class Main {
    static Map<Integer, Integer> counter = new HashMap<>();

    public static void main(String[] args) {
        System.out.println(newNumber(1));
        System.out.println(newNumber(2));
        System.out.println(newNumber(3));
        System.out.println(newNumber(1));
        System.out.println(newNumber(2));
        System.out.println(newNumber(1));
        System.out.println(newNumber(4));
        System.out.println(newNumber(1));
    }

    static int newNumber(int x) {
        int value;
        if (counter.containsKey(x)) {
            value = counter.get(x);
            counter.put(x, ++value);
        } else {
            value = -1;
            counter.put(x, 1);
        }
        return value;
    }
}

Вывод:

-1
-1
-1
2
2
3
-1
4
0 голосов
/ 15 февраля 2020

Я думаю, что это работает как требуется.

    static Map<Integer, Integer> map = new HashMap<>(); 

    public static int newNumber(int n) {
        // store the call count at the null key
        int calls = map.compute(null, (k,v)-> v == null ? 0 : v + 1);

        // initialize the argument entry first time encountered
        map.computeIfAbsent(n, v->calls);

        int c = calls - map.get(n) - 1;
        map.put(n, calls);
        return c;
    }
0 голосов
/ 15 февраля 2020

Предполагая, что я правильно понял вопрос следующим образом: «Вернуть количество вызовов метода с момента последнего предоставления текущего аргумента или -1, если он никогда не задавался раньше», тогда вы можете сделать это с любым Collection, который поддерживает порядок вставки.

Например:

private final List<Integer> invocations = new ArrayList<>();

public int newNumber(final int i) {
    if (!this.invocations.contains(i)) {

        // Not seen before, so add to the List, and return -1.
        this.invocations.add(i);
        return -1;
    }

    // size - 1 for 0 indexed list.
    // - last index of it since that was the last time it was called.
    final int lastInvocation
            = this.invocations.size() - 1 - this.invocations.lastIndexOf(i);

    // Remove all prior occurrences of it in the List.
    // Not strictly necessary, but stops the List just growing all the time.
    this.invocations.removeIf(value -> value.equals(i));

    // Add the element as the latest invocation (head of the List)
    this.invocations.add(i);
    return lastInvocation;
}

Примечание, безопасность потока очень здесь не рассматривается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...