Джава. Запись матрицы в файл с использованием информации столбца. (матричная транспозиция) - PullRequest
1 голос
/ 18 марта 2010

У меня есть файл, в котором хранится матрица. Этот файл имеет тип RandomAccessFile. Эта матрица хранится по столбцам. Я имею в виду, что в i-й строке этой матрицы хранится i-й столбец (реальной матрицы). Вот пример: i-й ряд: 1 2 3 4 (в файле). Это означает, что у реальной матрицы есть i-й столбец: (1 2 3 4) (транспонирован).

Мне нужно сохранить эту матрицу естественным образом (по строкам) в новом файле, который я затем открою с помощью FileReader и покажу с помощью TextArea.

Вы знаете, как это сделать? Если это так, пожалуйста, помогите =)

1 Ответ

2 голосов
/ 18 марта 2010

Хорошо, после понимания вопроса алгоритм, о котором я могу подумать, следующий.

  1. Открыть файл
  2. Читать строку из этого файла
  3. Если вы в первом ряду -> 3.1 Создайте файл для читаемой колонки
  4. Считать число из текущей строки
  5. Сохранить в соответствующем файле
  6. Продолжайте до тех пор, пока вы не закончите дамп, это оставит ваши файлы N, каждый из которых представляет столбец
  7. Теперь из всех созданных вами файлов:
  8. Прочитать каждый файл
  9. Запишите содержимое этого файла как обычную строку в выходной файл.

Примерно так:

file = File.open(myFile)

columns = File[] // columns is a file array, each one will contain a column from the original file

for each line in file
    numbersInThatLine : Integer[]
    numbersInThatLine = parseArrayFrom( line ) // created an array of int's from the given line
    writeArraryToFiles( array=numbersInThatLine, files=columns ) // write each number in a separate file
end


close( file )

output = File.new()

for each file in columns
    output.write( file )
end

close( output )

Итак, если ваш файл имеет

1 2 3 4 
5 6 7 8
9 10 11 12

Вы откроете 4 файла, и на первом проходе у вас будет

file0 = 1
file1 = 2
file2 = 3
file3 = 4

Во втором проходе у вас будет:

file0 = 1 5
file1 = 2 6
file2 = 3 7
file3 = 4 8

И наконец:

file0 = 1 5 9
file1 = 2 6 10
file2 = 3 7 11
file3 = 4 8 12

Наконец, записав каждый файл в выходной файл, вы получите

1 5 9  // from file0
2 6 10 // from file1
3 7 11 // from file2
4 8 12 // from file3

Что является (если я правильно понял на этот раз) тем, что вам нужно.

Удачи!

Итак, файл, содержащий:

1 2 3 4
5 6 7 8
9 10 11 12

будет представлять матрицу:

[[1, 2, 3, 4]
[5, 6, 7, 8]
[9, 10, 11, 12]]

??

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

  1. Открыть файл
  2. Читать каждую строку
  3. Разобрать элементы
  4. Сохраните их в массиве.

Примерно так:

 List<Integer[]> matrix = new ArrayList<Integer[]>();
 List<Integer> currentRow;

 BufferedReader reader = new BufferedReader( yourFile );

 String line = null;

 while((line = reader.readLine()) != null ) {
     Scanner scanner = new Scanner( line );
     currentRow = new ArrayList<Integer>();
     while( scanner.hasNextInt()){
         currentRow.add( scanner.nextInt() );
     }
     matrix.add( convertListToArray( currentRow )); // See: http://stackoverflow.com/questions/960431/how-to-convert-listinteger-to-int-in-java
 }

Примечание: я даже не скомпилировал приведенный выше код, поэтому он может не работать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...