将字符串转换为多维数组
我有一个字符串:
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]]