Проблема выглядит немного странной для меня. Но вот решение.
Посмотрите на комментарии к коду, чтобы понять, что происходит. Я включил дополнительный пример того, как вы можете использовать одну и ту же функцию вычисления (...), чтобы узнать, сколько раз данное число встречается в этом массиве.
public class Temp {
static int [] testData = {2, 5, 11, 2, 2, 7, 6, 3, 1, 9, 10, 6};
public static void main(String [] args){
answerToQuestion();
//extraQuestionForYou();
}
public static void answerToQuestion(){
//How many times does 2 occur in testData ? Answer is 3. Confirm it!
IntData intFinder = new IntData(testData);
int desiredNumber = 2;
int times = intFinder
//Find out how many times desiredNumber occurs in an array.
.compute(
//A function which tells me if one number is equal to another.
(number1, number2) -> number1 == number2,
//A function which says that it saw a number one more time, every time it sees that number.
someNumber -> 1,
//The number whose occurrence we want to find in an array.
desiredNumber
);
//Testing - Runs only when assertions are enabled for your JVM. Set VM args = -ea for your IDE.
assert times == 3 : "Expected " + desiredNumber + " to occur 3 times, but got " + times;
}
}
Что происходит внутри функция вычисления?
f.apply (значение, х):
f = (number1, number2) -> number1 == number2.
f.apply(value, x) means number1 = value and number2 = x.
result = result + g.apply (значение) :
g = someNumber -> 1.
g.apply(value) means return 1 whenever you see value.
Мы можем повторно использовать метод compute () для выполнения других задач, например, для определения, сколько раз тройка заданного числа встречается в массиве, помимо того, что задал исходный вопрос. Есть два способа сделать это - использовать приведенный выше код и искать 6, ИЛИ использовать функцию bi, которая проверяет, является ли одно число тройным по отношению к другому. Мы используем последний подход в коде ниже. Вместо этого вы можете придумать лучший пример.
public static void extraQuestionForYou(){
//How many times does triple of 2 occur in testData ? Answer is 2. Confirm it!
IntData intFinder = new IntData(testData);
int desiredNumber = 2;
int times = intFinder
//Find out how many times triple of desiredNumber occurs in an array.
.compute(
//A function which tells me if one number is equal to triple of another.
(number1, number2) -> number1 * 3 == number2,
//A function which says that it saw a number one more time, every time it sees that number.
someNumber -> 1,
//The number whose "triples" we want to find in an array.
desiredNumber
);
//Testing - Runs only when assertions are enabled for your JVM. Set VM args = -ea for your IDE.
assert times == 2 : "Expected " + desiredNumber + " to occur 2 times, but got " + times;
}