Список <String>----> в int [] [] обр - PullRequest
1 голос
/ 04 декабря 2011

Что ж, я был озадачен тем, как лучше всего это сделать, я написал код для чтения в строках кода из текстовых файлов в виде списка. Затем я могу распечатать определенные части или преобразовать это в массив объектов. Но, в конечном счете, я хотел бы иметь массив 2d int, который вы часто видите в C / C ++. Я очень зеленый, когда дело доходит до Явы, начав только в начале этой недели. Мне нравилось до этого момента создания динамических 2d-массивов во время выполнения. Может ли кто-нибудь из вас предложить хороший способ получить массив 2d int, из которого я сейчас застрял. Я как раз собирался преобразовать его в массив символов с помощью toChar, а затем взять (значение @ index-48) и сохранить его в соответствующем месте, но мне это кажется довольно гетто.

==== обновленный ==========================

Эх, спасибо за все ответы, но я только что понял, как это сделать с помощью двойных чисел, так что для всех остальных, вот и все. Я все еще предпочел бы иметь int, так как я уже построил мои другие классы matrixops, используя этот тип, но я не думаю, что Double должен быть проблемой.

package uaa.cse215;
import java.io.*;
import java.util.*;


public class ReadMatrix {
    private Double[][] A;
    private Double[][] B;
    private int count;

    public int filedir(String matrix) throws Exception{
        Double[][] Temp;
        String[] arr;
        BufferedReader rd = new BufferedReader(new FileReader(matrix));
        String s;
        List<String> textFile = new ArrayList<String>();
        while ((s=rd.readLine())!=null) {
            textFile.add(s);
            }
        String splitarray[] = textFile.get(0).split(" ");//run once to grab # cols
        int rows = textFile.size();//number of rows
        int cols = splitarray.length;//number of cols
        Temp = new Double[rows][cols]; // now can initiate array
            for (int i=0; i<rows; i++) {
                s = textFile.get(i);
                arr = s.split(" ");
                for (int j=0; j<cols; j++) { 
                    Temp[i][j] = Double.parseDouble(arr[j]);
                }
            }
            count++;
            if (count == 1){
                A = Temp;
            }
            else
                B = Temp;


            rd.close();
            return(1);
            }
}

Ответы [ 4 ]

2 голосов
/ 04 декабря 2011

Обратите внимание, что Java имеет тип данных char, представляющий собой 16-разрядное целое число без знака, содержащее кодовую точку UTF-16. int в Java всегда 32-битное целое число со знаком. Поэтому, если вы хотите использовать массив символов типа C, представляющий содержимое строки, вы должны использовать char[][]

Чтобы преобразовать содержимое вашего List<String> в двумерный массив, вы можете использовать следующий код:

char[][] twoDarray = new char[textFile.size()];
for(int i = 0; i < textFile.size(); i+)
{
     twoDarray[i] = textFile.get(i).toCharArray();
}

Затем массив twoDarray содержит все строки, каждая в виде массива char.

1 голос
/ 04 декабря 2011

Эта строка не будет компилироваться

splitarray[j] = textFile.get(i).split(" ");

, поскольку splitarray[j] имеет тип String, а split возвращает массив String s

Вместо этого выполните следующие действия:

   for(int row=0;row<textFile.size();row++){
       String[] splitarray = textFile.get(row).split(" ");
       for(int col=0;col<splitarray.length;col++){
           tmp[row][col] = Integer.parse(splitarray[col]);
       }
   }
0 голосов
/ 04 декабря 2011

если размеры входной матрицы являются динамическими или неровными, вы можете использовать

List<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();

для чтения чисел и затем скопировать их в необработанный 2d массив, если хотите.

java.util.Scanner имеет много удобных методов для чтения «типизированных» данных из ввода

Вот пример чтения файла в двумерный массив

public static int[][] read2DArray(String fileName) throws FileNotFoundException {

        Scanner sc = null;

        List<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();

        int columnCount = 0;
        int[][] arr = null;

        try {

            sc = new Scanner(new File(fileName));

            while (sc.hasNextLine()) {

                // Read line
                String line = sc.nextLine();

                // Split it
                String[] nums = line.split(" ");

                if (nums.length > columnCount) {
                    columnCount = nums.length;
                }

                // Convert to integers and add to list
                list.add(new ArrayList<Integer>());
                for (String n : nums) {
                    list.get(list.size() - 1).add(new Integer(n));
                }
            }

            // Convert list to array
            int rowCount = list.size();
            arr = new int[rowCount][columnCount];
            for (int i = 0; i < rowCount; i++) {
                for (int j = 0; j < list.get(i).size(); j++) {
                    arr[i][j] = list.get(i).get(j);
                }
            }

        } finally {
            if (sc != null) {
                sc.close();
            }
        }

        return arr;
    }
0 голосов
/ 04 декабря 2011

Предполагая, что ваш файл данных содержит числа в формате ascii, которые вы хотите разбить на целые числа:

11 -9 13
12 55 102
1 1 1024

Затем вы можете использовать конструктор Integer(String s) для анализа ваших строковых объектов.

Кроме того, я предлагаю разделить каждую строку только один раз. Для небольших массивов это не будет иметь большого значения, но чем больше ваши входные данные, тем больше вы будете без необходимости пересчитывать разбиения.

(не проверено) переписывание:

int tmp[][] = new int [rows][cols]; 
for(int i=0;i<rows;i++){
    splitarray = textFile.get(i).split(" ");
    for(int j=0;j<cols;j++){
        tmp[i][j] = Integer(splitarray[j]);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...