【问题标题】:Get Integers form a String using streams (Java) [closed]使用流(Java)获取整数形成字符串[关闭]
【发布时间】:2020-04-23 13:51:43
【问题描述】:

我目前正在执行一项任务,我应该编写一个非常简单的“聊天机器人”。 目标是一个公共 int 方法,它获取一个包含问题作为参数的 List。

每个问题可能包含也可能不包含数字,具体取决于聊天机器人应该以不同方式回答的数字。我事先不知道是否存在以及存在多少个数字,但可以安全地假设它们将在整数值范围内。如果同一个问题中有多个,我还需要创建一个平均数。

现在我需要用流提取所有不同的数字,然后相应地回复。

一个问题可能如下所示:“今天我的办公室会有 14 封或 27 封邮件吗?”

现在我需要一种方法来从该列表中的所有问题中提取所有数字,例如使用流的数组。关于我如何做到这一点的任何建议?代码行并不重要。它应该很快,出于某种原因,我需要使用 java.util.stream 中的流。

【问题讨论】:

  • 好的。现在你的问题是什么?
  • 对不起,如果我没有说清楚。最好的方法是从字符串中提取未知数量的整数,例如一个数组,而不是将它们与流混合在一起。
  • 这里至少有 2 个不同的问题(因此每个问题都有一个问题......)。首先,如何从字符串中提取整数,然后如何使用 Java 流 API 转换数据。我也认为您肯定会通过简单的谷歌搜索找到这两个问题的答案。
  • edit您的帖子并添加实际问题。也“最好”模糊,因为它取决于基础指标。最快的?最少的内存占用?最易读?最少的代码行数?最少的字符? ...
  • 对不起,我的第一篇文章,我正在尝试在上面更正它。

标签: java string integer java-stream extract


【解决方案1】:

你可以这样做:

import java.util.ArrayList;
import java.util.List;
import java.util.OptionalDouble;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        String str = "Will there be 14 or perhaps 27 mails in my office today?";
        Pattern p = Pattern.compile("\\d+");
        Matcher m = p.matcher(str);
        List<Integer> list = new ArrayList<Integer>();
        while (m.find()) {
            list.add(Integer.parseInt(m.group()));
        }

        int sum = 0;
        for (int n : list) {
            sum += n;
        }
        System.out.println("Average: " + sum / list.size());

        // Using Stream
        OptionalDouble average = list.stream().mapToDouble(a -> a).average();
        System.out.println("Average: " + (int) average.getAsDouble());

        // Another way of doing it using Stream
        int sumInts = list.stream().mapToInt(Integer::intValue).sum();
        System.out.println("Average: " + sumInts / list.size());
    }
}

输出:

Average: 20
Average: 20
Average: 20

更新:在不使用任何循环的情况下发布以下更新:

import java.util.Arrays;
import java.util.List;
import java.util.OptionalDouble;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        String str = "Will there be 14 or perhaps 27 mails in my office today?";
        String newStr = str.replaceAll("[^-0-9]+", " ");
        List<String> strList = Arrays.asList(newStr.trim().split(" "));
        List<Integer> list = strList.stream().map(s -> Integer.parseInt(s)).collect(Collectors.toList());

        // One way
        OptionalDouble average = list.stream().mapToDouble(a -> a).average();
        System.out.println("Average: " + (int) average.getAsDouble());

        // Another way
        int sumInts = list.stream().mapToInt(Integer::intValue).sum();
        System.out.println("Average: " + sumInts / list.size());
    }
}

输出:

Average: 20
Average: 20

另一个更新:根据您在评论中的要求发布另一个更新

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        list.add("Will there be 14 or perhaps 27 mails in my office today?");
        list.add("There are 40 candidates competing for 4 places");
        list.add("There are 6 teams each with 4 different channels");

        System.out.println("Numbers in each string:");
        list.stream().map(s -> Arrays.asList(s.replaceAll("[^-0-9]+", " ").trim().split(" ")))
                .collect(Collectors.toList()).stream()
                .map(lst -> lst.stream().map(s -> Integer.parseInt(s)).collect(Collectors.toList()))
                .forEach(System.out::println);

        System.out.println("Average of numbers in each string:");
        list.stream().map(s -> Arrays.asList(s.replaceAll("[^-0-9]+", " ").trim().split(" ")))
                .collect(Collectors.toList()).stream()
                .map(lst -> lst.stream().map(s -> Integer.parseInt(s)).collect(Collectors.toList()))
                .forEach(lst -> System.out.println(lst.stream().mapToInt(Integer::intValue).sum() / lst.size()));
    }
}

输出:

Numbers in each string:
[14, 27]
[40, 4]
[6, 4]
Average of numbers in each string:
20
22
5

【讨论】:

  • 您好,Arvind,感谢您的回答。可悲的是,我的任务包含,我需要使用流来执行此操作,并且不允许使用任何其他类型的循环,例如同时,为。
  • 非常感谢。我如何使用流而不是 while 循环从字符串列表中创建整数列表?
  • 您的更新非常棒,非常感谢您的努力。我只想再说一句。我已经有一个 List 作为参数,所以上面的 str 只是该 List 中我需要流式传输并取出整数的众多问题之一。
  • 非常感谢您的时间和努力。这对我很有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-08
  • 2022-01-23
  • 1970-01-01
  • 2017-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多