2015-10-05 2 views
1

У меня возникла проблема с созданием массива, который читается в качестве аргумента из командной строки. Первая строка этого файла представляет собой целое число N, а остальная часть этого файла содержит строки в каждой строке. Первое целое число - это размер массива. Я успешно выделил массив, однако я не могу заставить его прочитать всю строку файла input.txt.Как создать массив строк из файла input.txt

Ниже приведен пример файла input.txt:

4 
hey, 03982 
bye, 30980324 
no, 3290823 
yes, 30948432 

Вот хватка моего кода:

import java.util.Scanner; 
import java.io.*; 
import java.util.Arrays; 

class databaseSearch{ 

public static void main(String[] args){ 

    Scanner sc = null; 

    // if no arguments are entered, print out 
    // error message and correct way to invoke program 
    if(args.length == 0){ 
      errorMessage(); 
    } 

// Try and open the first argument on the command line 
    try{ 
     sc = new Scanner(new File(args[0])); 
    }catch(FileNotFoundException e){ 
     System.err.println(e.getMessage()); 
     errorMessage(); 
    } 


int arraySize = sc.nextInt(); 
sc.nextLine(); 
String[] DB = new String[arraySize]; 
for(int i = 0; i < arraySize; i++){ 
    DB[i] = sc.nextLine(); 
} 



    System.out.println(Arrays.toString(DB)); 

} 

// errorMessage() 
// prints out an error message with correct with to invoke program 
// terminates after instructions are given 
static void errorMessage(){ 
    System.err.println("Please try again by running the program along with a correct file."); 
    System.exit(1); 
} 
} 
+0

Что такое переменная бизнеса? Этот пример невозможно проверить, попробуйте запустить его в отладчике, чтобы увидеть результат шаг за шагом. И что правильно? – Evers

+1

исправил его, должен был быть DB.length –

ответ

0

Ваш снаружи в то время как цикл выглядит ненужным и опасным, как вы знаете структуру файла. Вместо этого получите свой сканер, получите первый int из файла, создайте свой массив с этим int, а затем зациклируйте это число раз, вот и все.

ПСЕВДОКОД

get scanner for file 
read in first int, call it arraySize. Note that nextInt() does not get the end of line token 
get nextLine from scanner **and discard it** to handle the end of line token 
create a String array arraySize length. 
for int i goes from 0 to less than arraySize 
    get a line from the Scanner 
    put line in your String array 
    // Split the line using String split. // not sure if this needs to be done 
end for loop 
close scanner 

Side Примечание: Вы хотите, чтобы изучить и использовать Java именования, включая предоставление переменных и методов имена, которые начинаются со строчной буквы, и давая классы имен, которые начинаются с верхней -буква. Следуя этим правилам, вы сможете создать код, который другие (us!) Могут выполнять намного проще.

например,

public static void main(String[] args) { 
    if (args.length == 0) { 
     // !! exit/error 
    } 

    String filePath = args[0]; 
    String[] lines = null; 

    // use try with resources so that the resource, here the Scanner 
    // gets closed when done being used. 
    try (Scanner scan = new Scanner(new File(filePath))) { 
     int arraySize = scan.nextInt(); // get first int 
     scan.nextLine(); // swallow the end-of-line token 
     lines = new String[arraySize]; 
     for (int i = 0; i < lines.length; i++) { 
      lines[i] = scan.nextLine(); 
     } 

     System.out.println("Display results:"); 
     for (String line : lines) { 
      System.out.println(line); 
     } 
    } catch (FileNotFoundException e1) { 
     e1.printStackTrace(); 
    } 
} 
+0

, так что я сделал, так что я сделал массив глобальной переменной, поэтому его можно было запустить из любой точки программы, петли выполняются нормально, это просто не заполняет мой массив содержимым I нужно заполнить его. если я меняю nextLine() на Next(), он принимает первый токен второй строки и заполняет весь массив только этим –

+0

@sartar: попробуйте мои рекомендации выше. Кроме того, у нас нет знаний о глобальном/местном, так как это не информация, которую вы поделили с нами. Если бы это была моя программа, и если бы я читал в массиве в методе, я бы сделал массив локальной ** переменной **, и мой метод чтения ** возвратил ** завершенный массив. –

+0

Думаю, мне не нужен мой цикл while, а если утверждение в первых нескольких строках? Я просто подумал, что это необходимо, чтобы сначала открыть и прочитать файл .txt. –

0

Используйте Files.readAllLines().

List<String> lines = Files.readAllLines(Paths.get(arg[0])); 
if (lines.isEmpty()) 
    throw new IllegalArgumentException("Empty file"); 
int count = Integer.parseInt(lines.remove(0)); 
if (lines.size() != count) 
    throw new IllegalArgumentException("Incomplete file"); 
String[] db = lines.toArray(new String[count]); 
Смежные вопросы