当前位置: 首页 > 知识库问答 >
问题:

Java将表达式解析字符串流化为双[m][n](其中n的大小不同)

谢胤
2023-03-14

作为解析配置字符串的一部分,我想将字符串转换为double[][]数组。配置字符串包含一个或多个(m)组三个或多个(n)个元素。

对于输入:“0,0,0 500,0,10 0,300,20 500,300,30”,
我希望输出:double[][]{{0,0,0},{500,0,10},{0,300,20},{500,300,30}}

下面的清单起作用,但是,我想改进代码如下(我很难做到这一点):

  1. 使代码泛型化,用于可变数量的n元素,以便它接受输入,如“0,0,0 500,0,10 0,300,20,999 500,300,30”,其中输出[2]=[0,300,20,999]。我当前使用的(映射(x->new double[]{double.ParseDouble(x[0]),double.ParseDouble(x[1]),double.ParseDouble(x[2])})),我要对其进行通用重写。
  2. 最好将两个流表达式合并为一个表达式,一次输入字符串并输出double[m][n]。这可能吗?

列表:

    String ss = "0,0,0  | 500,0,10  |  0,300,20  | 500,300,30";
    System.out.println(ss);
    
    String[][] result_s = 
            Arrays.
            stream(ss.split("\\|")).
            map(x -> x.trim().split(",")).
            toArray(size -> new String[size][1]);
    double[][] result_d = 
            Arrays.stream(result_s).
            //This next line is the embarrassing part and I would like to make it generic (so independent of number of elements
            map(x -> new double[]{Double.parseDouble(x[0]),Double.parseDouble(x[1]),Double.parseDouble(x[2])})
            .toArray(size -> new double[size][1]);
    
    double[][] result_new = Arrays.stream(ss.split("\\|")).collect(Collectors.toList(entry -> entry.x.trim().split(",")));
            Arrays.
            stream(ss.split("\\|")).
            map(x -> x.trim().split(",")).
            map(x -> new double[]{Double.parseDouble(x[0]),Double.parseDouble(x[1]),Double.parseDouble(x[2])}).
            toArray(size -> new String[size][1]);
    
    //Strings array
    System.out.println("String arrays");
    for(String[] rs : result_s) System.out.println(Arrays.toString(rs));
    
    //double array
    System.out.println("Double arrays");
    for(double[] rs : result_d) System.out.println(Arrays.toString(rs));

输出:

0,0,0 500,0,10 0 300,20 500 300,30
字符串数组
[0,0,0]
[500,0,10]
[0,300,20]
[500,300,30]
双数组
[0.0,0.0,0.0]
[500.0,0.0,10.0]
[0.0,300.0,20.0]
[500.0,300.0,20.0]
[500.0,300.0,30.0]

共有1个答案

厉文栋
2023-03-14

首先,对于“尴尬行”,您可以流式处理每个x,它是一个double[],以及maptodouble:

.map(x -> Arrays.stream(x).mapToDouble(Double::parseDouble).toArray())

第二,这两条溪流可以非常简单地连接起来。如果没有toArray(size->new string[size][1]),第一个流就是stream ,这也是arrays.stream(result_s)生成的。

toArray将流转换为数组,而Arrays.stream将数组转换为流,因此Arrays.stream(result_s)类似于撤消toArray(size->new string[size][1])所做的事情。这两条线可以互相抵消。

double[][] result_d =
        Arrays.stream(ss.split("\\|"))
                .map(x -> x.trim().split(","))
                .map(x -> Arrays.stream(x).mapToDouble(Double::parseDouble).toArray())
                .toArray(double[][]::new);
 类似资料:
  • 问题内容: 我想将一个非常大的字符串(例如10,000个字符)分割成N个大小的块。 就性能而言,最佳方法是什么? 例如: 被2分割成。 使用这种方法是否可能实现?如果可以,从性能角度来看,这是否是最佳方法? 问题答案: 您可以执行以下操作: 该方法仍可用于大小不是块大小的整数倍的字符串: 通常,对于要从中提取最多 n个 大小的子字符串的任何字符串,都可以执行以下操作: 如果您的字符串可以包含换行符

  • 本文向大家介绍正则表达式{n,m}量词(至少n次,最多m次),包括了正则表达式{n,m}量词(至少n次,最多m次)的使用技巧和注意事项,需要的朋友参考一下 正则表达式{n,m}量词: {n,m}量词可以重复前面匹配的字符n-m次,至少n次,最多m次。 语法结构: 构造函数方式: 对象直接量方式: 浏览器支持: IE浏览器支持此元字符。 火狐浏览器支持此元字符。 谷歌浏览器支持此元字符。 实例代码:

  • 问题内容: 我需要将浮点数格式化为“ n”个小数位。 试图使用BigDecimal,但返回值不正确… 我需要返回一个浮点数,该浮点数具有我指定的小数位数。 我不需要价值回报 问题答案: 你还可以传递float值,并使用:

  • 问题内容: 试图了解正则表达式,我在重复的部分:。 我有以下代码: 如您所见,两个字符串都不匹配该模式。为什么会这样呢? 问题答案: 您不应该在逗号后加空格,这是多余的。

  • 问题内容: 请看下面的正则表达式,这里是任何正则表达式。 此正则表达式将测试确切X发生的时间或时间。 是否有一个正则表达式量词可以测试的发生恰好或次? 问题答案: 没有单个量词的意思是“恰好是m或n次”。你的操作方式很好。 替代方法是: 其中和是的值。

  • 如果我删除原始YAML中后面的空格,它就可以正常工作