将字符串转换为多维数组

时间:2018-09-13 12:07:43

标签: java string multidimensional-array

我有一个字符串:

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<String> stringProfileList= Arrays.asList(stringProfile.split(" "));

输出将为"0, 4.28, 10, 4.93, 20, 3.75",因此现在每个元素都由一个“”分隔,而不是每个元素。

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

这是解决这个问题的正确方法吗?我陷入了每2个元素实现的问题。

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

2 个答案:

答案 0 :(得分:1)

如果您想使用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,这些空白字符后面是 ,而前面是 。这将导致一个Stream字符串,其中包含一对数字,其中一对数字除以', '。我们在第一个split','上的这个字符串map得到代表数字的字符串数组。在下一个map中,将计算解析出的数字及其弧度。

我们可以将数字的解析和弧度的计算指定为单个map步骤。以下代码较为冗长,但会创建一个附加的double数组:

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;
        })

最后一步将双精度数组收集为二维数组。


编辑:

看看this demo

使用Pattern类文档的措辞,使用的模式查找空格字符(\\s),该字符前面((?<=\\d) = < em>向后看),然后以一位数字((?=\\d)开头(\\d = 向前看)。这些外观具有零宽度,因此可以对其进行捕获(匹配)评估,但不属于匹配序列的一部分({{3} }。 匹配序列仅包含一个空白字符(\\s)。

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

答案 1 :(得分:0)

如果在前加逗号分隔,则会得到一对逗号分隔的对。然后可以将它们再次拆分并映射到 private static Int32 GetSheetIdFromSheetNum(string sSpreadsheetId, Int32 iSheetNum, SheetsService gsService, ref string sTitle) { //Get the Sheet Id for the specified sheet number and Spreadsheet id. Int32 iSheetId = -1; Int32 iLoop = -1; //Google.Apis.Sheets.v4.Data.Sheet gsSheet; Google.Apis.Sheets.v4.Data.Spreadsheet gsSpreadsheet; try { sTitle = string.Empty; gsSpreadsheet = gsService.Spreadsheets.Get(sSpreadsheetId).Execute(); foreach (Sheet gsSheet in gsSpreadsheet.Sheets) { iLoop += 1; if (iLoop != iSheetNum) { continue; } iSheetId = (gsSheet.Properties.SheetId).GetValueOrDefault(-1); sTitle = gsSheet.Properties.Title; break; } } catch (Exception ex) { // Do error processing here. } return iSheetId; } //GetSheetIdFromSheetNum

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

checking whether to enable pthreads... yes, shared
checking whether to enable AddressSanitizer for pthreads... no
checking whether to enable dmalloc for pthreads... no
checking for ZTS... configure: error: pthreads requires ZTS, please re-compile PHP with ZTS enabled
ERROR: `/tmp/pear/temp/pthreads/configure --with-php-config=/usr/bin/php-config' failed
  

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