首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 8:计数给定int数组中数字4的出现

Java 8:计数给定int数组中数字4的出现
EN

Stack Overflow用户
提问于 2022-03-11 19:43:34
回答 3查看 781关注 0票数 -2

我是Java 8的新手,我尝试了几种方法来使用Streams API来解决这样的问题:给我们一个int = {48,44,4,88,84,16,12,13 }的数组。我所要做的就是在整个数组中找到数字4的出现。我试过以下代码-

代码语言:javascript
复制
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方法。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-03-11 20:32:38

首先,您需要从给定的数组中获取int[]。您可以使用静态方法IntStream.of,也可以使用Arrays实用程序类和它的方法stream()

两者都会给您一个IntStream --一个int原语流。为了将流元素收集到列表中,需要将其转换为对象流。为此,您可以在流管道上应用方法boxed(),每个int元素都将被Integer对象包装。

为了在给定列表中查找包含目标数字 (4)的所有元素,可以将目标数字转换为字符串,然后根据字符串应用filter

代码语言:javascript
复制
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()

代码语言:javascript
复制
public static void main(String[] args) {
    int[] nums = {48,44,4,88,84,16,12,13};

    System.out.println(findOccurrencesOfDigit(nums, 4));
}

输出

代码语言:javascript
复制
[48, 44, 4, 84]

注释:方法filter()需要一个Predicate (一个由布尔条件表示的函数,它接受一个元素并返回true of false)

创建谓词filter(n -> n % 10)的尝试在语法和逻辑上都是不正确的。n % 10不会产生布尔值,它会给出最合适的n数字。

如果要使用模数(%)运算符创建谓词,则必须在循环中将元素除以10,直到元素不等于0为止。并在每个除法天气余数等于目标数字之前进行检查。可以这样做:

代码语言:javascript
复制
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表达式的首选方法)

代码语言:javascript
复制
filter(n -> containsDigit(n, digit))
票数 -1
EN

Stack Overflow用户

发布于 2022-03-11 20:36:01

我认为一个简单的方法是将数字列表转换为字符串,并计算所选数字的ocurrence。

代码语言:javascript
复制
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?
}
票数 1
EN

Stack Overflow用户

发布于 2022-03-11 20:42:08

这里有一条路。

  • 流数组
  • ,然后在map中使用余数(%)运算符计算每个值中的4次数。
  • 然后返回计数
  • ,并将计数值

之和

代码语言:javascript
复制
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);

版画

代码语言:javascript
复制
There are 5 fours.

如果您使用的是Java 16+,则可以使用mapMulti

  • 简单地在溪流上为4的每一次加1。
  • 它们加在一起。

代码语言:javascript
复制
int count = Arrays.stream(array).mapMulti((i,consumer)->{
        while (i > 3) {
            if ((i%10) == 4) {
                consumer.accept(1);
            }
            i/=10;
        }}).sum();

只是为了好玩,第三种也是效率较低的方法。

将值转换为String

  • "remove“除4以外的所有字符。

  • 返回剩余字符串的长度。

  • 求和长度。

代码语言:javascript
复制
int count = Arrays.stream(array)
            .map(i -> Integer.valueOf(i).toString()
                        .replaceAll("[^4]", "").length())
            .sum();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71443901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档