Я экспериментировал с этим вопросом сегодня, из проблем Эйлера:
Палиндромное число читается одинаково в обоих направлениях. Самый большой палиндром, полученный из продукта двух двузначных чисел, составляет 9009 = 91 × 99.
Найдите самый большой палиндром, сделанный из продукта двух трехзначных чисел.
Я подумал об этом, и, конечно, это можно сделать с помощью for-loops, однако я хочу использовать Java 8, поскольку он открывает новые параметры.
Однако, прежде всего, я не знаю, как создать IntStream
, который создает такие элементы, поэтому я все равно использовал обычные for-loops:
public class Problem4 extends Problem<Integer> {
private final int digitsCount;
private int min;
private int max;
public Problem4(final int digitsCount) {
this.digitsCount = digitsCount;
}
@Override
public void run() {
List<Integer> list = new ArrayList<>();
min = (int)Math.pow(10, digitsCount - 1);
max = min * 10;
for (int i = min; i < max; i++) {
for (int j = min; j < max; j++) {
int sum = i * j;
if (isPalindrome(sum)) {
list.add(sum);
}
}
}
result = list.stream().mapToInt(i -> i).max().getAsInt();
}
private boolean isPalindrome(final int number) {
String numberString = String.valueOf(number);
String reversed = new StringBuilder(numberString).reverse().toString();
return (numberString.equals(reversed));
}
@Override
public String getName() {
return "Problem 4";
}
}
Как вы можете видеть, я, возможно, немного ленив, на самом деле IntStream::max
- очень хороший метод, и я думаю, что лучше использовать его, чтобы написать его самостоятельно.
Вот и проблема: мне нужно иметь list
теперь, чтобы получить максимум таким образом, что означает, что мне нужно хранить данные, где я действительно не должен делать поэтому.
Итак, теперь вопрос, можно ли реализовать это в Java 8?
for (int i = min; i < max; i++) {
for (int j = min; j < max; j++) {
yield i * j;
}
}
И затем из этого метода создайте PrimitiveIterator.OfInt
(unboxes версии Iterator<Integer>
или создайте IntStream
напрямую?
Тогда получить ответ с помощью streamFromYield.filter(this::isPalindrome).max().getAsInt()
было бы очень легко реализовать.
Наконец, я знаю, что этот вопрос задавали раньше, однако последний раз уже совсем немного назад, и теперь Java 8 скоро произойдет, где они добавили как большую концепцию Stream<T>
, так и новую конструкцию языка, называемый лямбдами.
Поэтому такой код может быть совсем другим, чем когда люди делали его для Java 6 или 7.