将字符串转换为多维数组

我有一个字符串:

String stringProfile = "0, 4.28 10, 4.93 20, 3.75"; 

我试图把它变成一个如下数组:

 double [][] values = {{FastMath.toRadians(0), FastMath.toRadians(4.28)}, {FastMath.toRadians(10), FastMath.toRadians(4.93)}, {FastMath.toRadians(20), FastMath.toRadians(3.75)}}; 

其中FastMath.toRadians是每个元素的方法。

问题数量:

第一个合乎逻辑的做法是拆分字符串:

 List stringProfileList= Arrays.asList(stringProfile.split(" ")); 

输出将是"0, 4.28, 10, 4.93, 20, 3.75" ,所以现在每个元素都被“,”而不是所有其他元素分开。

然后,对于列表中的每2个元素,我需要分配给一个数组。 在每个Array中,我在每个元素上应用FastMath.toRadians(),然后将每个数组附加到一个更大的多维数组。

这是正确的方法吗? 我正在坚持实施每2个元素。

我还需要将这些字符串元素转换为double,这似乎并不重要。

如果你想使用Stream试试这个:

  Pattern PAIR = Pattern.compile("(?<=\\d)\\s(?=\\d)"); double[][] result = PAIR.splitAsStream(stringProfile) .map(pair -> pair.split(",")) .map(pair -> new double[] { FastMath.toRadians(Double.valueOf(pair[0])), FastMath.toRadians(Double.valueOf(pair[1])) }) .toArray(i -> new double[i][]); 

Pattern用于在空白字符上拆分stringProfile ,这些字符后面后面都有一个数字。 这导致一串字符串,其中包含一对除以', '的数字。 我们在第一个map将此字符串split','以获取表示数字的字符串数组。 在下一个map ,计算解析的数字和它们的弧度。

我们可以将数字和弧度的解析分解为单个map步骤。 以下代码更详细,但创建了一个额外的双数组:

 double[][] result = PAIR.splitAsStream(stringProfile) .map(pair -> pair.split(",")) .map(pair -> new double[] { Double.valueOf(pair[0]), Double.valueOf(pair[1]) }) .map(pair -> new double[] { FastMath.toRadians(pair[0]), FastMath.toRadians(pair[1]) }) .toArray(i -> new double[i][]); 

如果我们想重用双数组,我们可以这样做:

  .map(pair -> { pair[0] = FastMath.toRadians(pair[0]); pair[1] = FastMath.toRadians(pair[1]); return pair; }) 

最后一步将双数组收集到二维数组中。


编辑:

看看这个演示 。

使用Pattern类文档的措辞,使用的模式查找前面的空白字符( \\s )( (?<=\\d) = look behind )并成功( (?=\\d) = 向前看一个数字( \\d )。 这些外观具有零宽度 ,因此它们被评估用于捕获(匹配)但不是匹配序列的一部分( Matcher.group() )。 匹配序列仅包含空格字符( \\s )。

对于stringProfile此模式将在两种情况下匹配: "8 1""3 2" 。 在这些情况下,两个数字围绕" " 。 另一方面,例如"0, 4"不匹配。 ","的出现阻止了匹配。

你是对的,首先将字符串拆分为子字符串列表,然后在列表上做一个foreach,并将FastMath torad结果添加到新的结果列表:

 List list = new ArrayList(); List results = new ArrayList(); for (String string : list) { results.add(FastMath.toRadians(Double.valueOf(string))); } results.toArray(); 

接下来要做的是将数组拆分为您选择的新多维数组,方法是迭代它并将其排序到多维数组中。

但是,如果你没有被迫使用数组,我会使用更高的datataype,如地图或列表,或者一个元组或更适合你需要的东西。 只需查看java集合为您提供的内容。

如果您在带逗号的空格上分割,则会得到以逗号分隔的对。 然后可以将它们再次拆分并映射到Double[]

您可以在之后添加任何进一步的处理。

 private void test() { String s = "0, 4.28 10, 4.93 20, 3.75"; // Split on space without comma beforehand. Double[][] doubles = Arrays.stream(s.split("(? pairString.split(", ")) // Make each pair into a Double[] .map(pair -> new Double[]{Double.valueOf(pair[0]), Double.valueOf(pair[1])}) // to array of Double[][] .toArray(Double[][]::new); System.out.println(Arrays.deepToString(doubles)); } 

[[0.0,4.28],[10.0,4.93],[20.0,3.75]]