Как преобразовать строку, содержащую double, в матрицу в java - PullRequest
2 голосов
/ 02 марта 2020

String a = "0 2 4 1 4.5 2.2 1.1 4.3 5.2";

Здесь у нас есть строка из 9 чисел, некоторые из которых двойные, а некоторые целые. Мне нужно преобразовать это в матрицу, и когда мне дают только целочисленные значения в строке, это довольно легко, потому что все, что я делаю, удваивается на целое число после того, как я анализирую для каждого значения строки, которое является di git.

Например,

String a = "1 2 3 4 5 6 7 8 9";
double[][] matrixA = new double[3][3];
int counter = 0;
for(int i=0; i<=a.length(); i++){
   char c = a.charAt(i);
   if(c==' '){
      counter=counter;
   }
   else{
      counter++;
      double k = Double.parseDouble(String.valueOf(c));
      if(counter<=3){
         matrixA[0][counter-1] = k;
      }
      else if (counter>3 && counter<=6){
         matrixA[1][counter-4] = k;
      }
      else{
         matrixA[2][counter-7] = k;
      }
   }
}

Это дает мне матрицу 3 на 3, которая идет от 1 до 9. Однако, когда мне дают строку, которая содержит действительные числа или «двойники», мой метод не может создать матрицу, потому что он считает каждый элемент строки, один из которых является точкой. Итак, как я могу создать матрицу 3 на 3, если данная строка содержит двойное число?

Ответы [ 2 ]

4 голосов
/ 02 марта 2020

Ответ @ rempas хорош, хотя я бы заменил вычисление входного индекса простым индексом «следующего значения».

String a = "1 2 -3 4.5 5 6.5 7.5 8 9";
double[][] matrix = new double[3][3];
String[] nums = a.split(" ");
for (int i = 0, k = 0; i < matrix.length; i++) { // <== Initialize k here
    for (int j = 0; j < matrix[i].length; j++) {
        matrix[i][j] = Double.parseDouble(nums[k++]); // <== Simpler code
    }
}
System.out.println(Arrays.deepToString(matrix));

Выход

[[1.0, 2.0, -3.0], [4.5, 5.0, 6.5], [7.5, 8.0, 9.0]]

Jagged Array

Это заставит его работать, даже если 2D-массив jagged .

String a = "1 2 -3 4.5 5 6.5 7.5 8 9";
double[][] matrix = new double[][] { new double[2], new double[3], new double[4] }; // <== Jagged array
String[] nums = a.split(" ");
for (int i = 0, k = 0; i < matrix.length; i++) {
    for (int j = 0; j < matrix[i].length; j++) {
        matrix[i][j] = Double.parseDouble(nums[k++]);
    }
}
System.out.println(Arrays.deepToString(matrix));

Вывод

[[1.0, 2.0], [-3.0, 4.5, 5.0], [6.5, 7.5, 8.0, 9.0]]

Сканер

В качестве альтернативы вместо split() и k++ logi c используйте Scanner.

String a = "1 2 -3 4.5 5 6.5 7.5 8 9";
double[][] matrix = new double[3][3];
try (Scanner sc = new Scanner(a)) { // <== Use Scanner
    for (int i = 0; i < matrix.length; i++) {
        for (int j = 0; j < matrix[i].length; j++) {
            matrix[i][j] = sc.nextDouble(); // <== Use Scanner
        }
    }
}
System.out.println(Arrays.deepToString(matrix));

Выход

[[1.0, 2.0, -3.0], [4.5, 5.0, 6.5], [7.5, 8.0, 9.0]]
3 голосов
/ 02 марта 2020

Это должно сработать как для двойных, так и для отрицательных чисел. Обратите внимание на преобразование координат матрицы в индекс index = x + y * width

String a = "1 2 -3 4.5 5 6.5 7.5 8 9";
double[][] matrix = new double[3][3];
String[] nums = a.split(" ");

for(int i = 0; i < matrix.length; i++){
    for(int j = 0; j < matrix[0].length; j++){
        matrix[i][j] = Double.parseDouble(nums[matrix[j].length * i + j]);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...