2016-02-28 2 views
0

У меня есть текстовый файл, который был прочитан в список, а затем преобразован в массив. В текстовом файле каждая строка является элементом двумерного массива. Однако преобразование из текстового файла в массив помещает элементы в неправильный порядок, который не совпадает с файлом.2D-массивы сортировки

Вот мой код до сих пор:

import java.io.*; 
import java.nio.file.Files; 
import java.nio.file.Paths; 
import java.util.*; 
import java.io.File; 
import java.io.FileReader; 
import java.io.IOException; 

/** 
* @(#)ReadFromFile.java 
* 
* 
* @author 
* @version 1.00 2016/2/25 
*/ 

public class ReadFromFile { 

    public static String[] readFile(String path){ 
    try{ 
     int i = 0; 
     int length = Files.readAllLines(Paths.get(path)).size(); 
     String[] results = new String[length]; 
     for(String line : Files.readAllLines(Paths.get(path))){ 
     results[i++] = line; 
     } 
     return results; 
    } catch(IOException e) { 
     e.printStackTrace(); 
     return null; 
    } 
    } 

    public static void main(String[] args) { 
    // Operation for Prescription File 
    String[] lines = readFile("prescription.txt"); 
    String[] array = new String[7]; 
    ArrayList<String> mylist = new ArrayList<String>(); 
    for(String line : lines){ 
     for (String s : line.split(" ")){ 
     mylist.add(s); 
     } 
    } 
    String[] pre = mylist.toArray(array);// Stores the elements in  prescription txt 
    System.out.println(Arrays.toString(pre)); 
    // Operation for medicament file`enter code here` 
    String[] lines2 = readFile("medicaments.txt"); 
    ArrayList<String> mylist2 =`enter code here` new ArrayList<String>(); 
    int count = 0;// varıable for countıng lines of medicaments file 
    for(String line2 : lines2){ 
     count++; 
     for (String s : line2.split(" ")){ 
     mylist2.add(s); 
     } 
    } 
    String[] array2 = new String[count * 5]; 
    String[] med = mylist2.toArray(array2);// Stores the elements in prescription txt 
    //Converting (medicaments.txt) 1d array into 2d array 
    String array2d[][] = new String[count][5]; 

    for(int i=0; i<count;i++){ 
     for(int j=0;j<5;j++){ 
      array2d[i][j] = med[(j*count) + i]; 
     } 
    } 
    System.out.println(Arrays.deepToString(array2d)); 
    // Initialize array variables to compare 
    String medicine1 = pre[3]; 
    String medicine2 = pre[5]; 
    String numOfmedicine1 = pre[4]; 
    String numOfmedicine2 = pre[6]; 
    String socSecurity = pre[1]; 
    String date = pre[1]; 
    } 
} 

А вот мой текст документа:

aspirin ssk 01.01.2016 31.01.2016 5.5 
aspirin ssk 01.01.2016 31.01.2016 4 
aspirin es 01.01.2016 31.01.2016 5.4 
aspirin bk 01.01.2016 31.01.2016 6.1 
aspirin ssk 01.01.2016 31.01.2016 5.4 
novalgin ssk 01.01.2016 31.01.2016 8.3 

Выходные элементы в каждой строке выйти в другом порядке:

[[aspirin, ssk, 01.01.2016, 31.01.2016, 5.4], [ssk, 01.01.2016, 31.01.2016, 6.1, novalgin], [01.01.2016, 31.01.2016, 5.4, aspirin, ssk], [31.01.2016, 4, aspirin, ssk, 01.01.2016], [5.5, aspirin, bk, 01.01.2016, 31.01.2016], [aspirin, es, 01.01.2016, 31.01.2016, 8.3]] 

Как это исправить?

+0

Текстовый документ не был напечатан, как я хочу это здесь: https://d1b10bmlvqabco.cloudfront.net/attach/ike11m7a4ot3k5/h8d6286u53f76o/il23enxfun91/medicaments.txt –

+0

пытаются упростить код таким образом, что будет читаемым – LordTitiKaka

+0

Примечание что вы импортируете два текстовых файла в этот код. Можете ли вы предоставить полный образец ввода? –

ответ

2

Во-первых, вы слишком много компрометируете. Вся ваша функция readFile излишне преобразует List<String> в массив строк, только для того, чтобы вы могли преобразовать его обратно. Ваш класс должен использовать Files.readAllLines() напрямую, избегать использования массивов непосредственно в пользу полных вариантов списка и посмотреть что-то вроде этого:

import java.nio.file.Files; 
import java.nio.file.Paths; 
import java.util.*; 
import java.io.IOException; 

public class ReadFromFile { 

    public static List<String> getWords(String path) { 
    try { 
     List<String> lines = Files.readAllLines(Paths.get(path)); 
     List<String> words = new ArrayList<>(); //Use descriptive variable names! 
     for (String line : lines) { 
     for (String word : line.split(" ")) { 
      words.add(word); 
      System.out.println(word); 
     } 
     } 
     return words; 
    } catch (IOException e) { 
     //handle exception 
     return null; //This is not advised 
    } 
    } 

    public static void main(String[] args) { 
    List<String> prescription_words = getWords("prescription.txt"); 
    List<String> medicaments_words = getWords("medicaments.txt"); 

    List<List<String>> list2d = new ArrayList(); 

    for (int idx=0; idx < medicaments_words.size(); idx++) { 
     // Iterate through your medications and add them to your 2dArray 
    } 
    } 
} 

Теперь это не решить две вещи. Во-первых, ваш исходный код имеет два текстовых файла, только один из которых указан (что?). Во-вторых, вы не ясно, как на самом деле должно произойти преобразование:

for(int i=0; i<count;i++){ 
    for(int j=0;j<5;j++){ 
     array2d[i][j] = med[(j*count) + i]; 
    } 
} 

Вы неясны (в основном потому, что count, i и j плохие переменные для использования), где вы хотите, что в конечном итоге. Это более читаемо:

for(int row=0; row < number_of_meds; row++){ 
    for(int column=0; column < 5; column++){ 
     index_of_medication = (column * number_of_meds) + row 
     array2d[row][column] = med[index_of_medication]; 
    } 
} 

Но это своего рода странный способ выразить это. То, что вы действительно хотите сделать, это перебрать ваши лекарства и поместить их в массив 2d. Все, что вам нужно сделать, это сначала настроить внешний массив, а затем добавить элементы в каждый внутренний массив.

+0

Большое спасибо –

+1

@HabilGanbarli Обязательно проголосуйте за ответы, которые вам помогли! Кроме того, «принимая» ответы вы можете пригласить дополнительную помощь в будущем. –

Смежные вопросы