我是Java 8的新手,我尝试了几种方法来使用Streams API来解决这样的问题:给我们一个int = {48,44,4,88,84,16,12,13 }的数组。我所要做的就是在整个数组中找到数字4的出现。我试过以下代码-
int[] array = new int[] {48,44,4,88,84,16,12,13};
List<Integer> list = new ArrayList<Integer>();
for(int i:array) {
list.add(i);
}
List<Integer> l = list.stream().filter(n->n%10)
.map(n->n%10)
.collect(Collectors.toList());
System.out.println(l);请提供解决此问题的Streams方法。
发布于 2022-03-11 20:32:38
首先,您需要从给定的数组中获取int[]流。您可以使用静态方法IntStream.of,也可以使用Arrays实用程序类和它的方法stream()。
两者都会给您一个IntStream --一个int原语流。为了将流元素收集到列表中,需要将其转换为对象流。为此,您可以在流管道上应用方法boxed(),每个int元素都将被Integer对象包装。
为了在给定列表中查找包含目标数字 (4)的所有元素,可以将目标数字转换为字符串,然后根据字符串应用filter。
public static List<Integer> findOccurrencesOfDigit(List<Integer> source,
int digit) {
String target = String.valueOf(digit);
return source.stream()
.filter(n -> String.valueOf(n).contains(target))
.collect(Collectors.toList());
}main()
public static void main(String[] args) {
int[] nums = {48,44,4,88,84,16,12,13};
System.out.println(findOccurrencesOfDigit(nums, 4));
}输出
[48, 44, 4, 84]注释:方法filter()需要一个Predicate (一个由布尔条件表示的函数,它接受一个元素并返回true of false)
创建谓词filter(n -> n % 10)的尝试在语法和逻辑上都是不正确的。n % 10不会产生布尔值,它会给出最合适的n数字。
如果要使用模数(%)运算符创建谓词,则必须在循环中将元素除以10,直到元素不等于0为止。并在每个除法天气余数等于目标数字之前进行检查。可以这样做:
public static boolean containsDigit(int candidate, int digit) {
boolean flag = false;
while (candidate != 0) {
if (candidate % 10 == digit) {
flag = true;
break;
}
candidate /= 10; // same as candidate = candidate / 10;
}
return flag;
}您可以在这样的lambda表达式中使用此方法(注意:通过将多行lambda表达式提取到单独的方法中,这是避免多行lambda表达式的首选方法)
filter(n -> containsDigit(n, digit))发布于 2022-03-11 20:36:01
我认为一个简单的方法是将数字列表转换为字符串,并计算所选数字的ocurrence。
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 10, 11, 12, 13, 14, 15);
for(int i = 0; i < 10; i++) {
System.out.println("Digit: " + i + " -> Ocurrences: " + countDigit(i, numbers);
}
}
public static long countDigit(int target, List<Integer> numbers) {
return numbers.stream().map(Object::toString) // Convert each number to string
.collect(Collectors.joining()) // Join all of them into single string
.chars() // Give me a stream of its characters
.filter(c -> c == Character.forDigit(targer, 10)) // I just want the ones that are the same as my target
.count(); // How many of them are there?
}发布于 2022-03-11 20:42:08
这里有一条路。
之和
int[] array = new int[] { 48, 44, 4, 88, 84, 16, 12, 13 };
int count = Arrays.stream(array).map(k-> {
int sum = 0;
while (k > 3) {
sum += (k % 10 == 4) ? 1 : 0;
k/=10;
}
return sum;
}).sum();
System.out.printf("There are %d fours.%n"m count);版画
There are 5 fours.如果您使用的是Java 16+,则可以使用mapMulti
int count = Arrays.stream(array).mapMulti((i,consumer)->{
while (i > 3) {
if ((i%10) == 4) {
consumer.accept(1);
}
i/=10;
}}).sum();只是为了好玩,第三种也是效率较低的方法。
将值转换为String
int count = Arrays.stream(array)
.map(i -> Integer.valueOf(i).toString()
.replaceAll("[^4]", "").length())
.sum();https://stackoverflow.com/questions/71443901
复制相似问题