2014-02-08 3 views
-2

Я пытаюсь написать простой алгоритм синтаксического анализа для анализа следующие данные:Проблема с моим алгоритмом синтаксического анализа (Java)

Вход:

3 9 6 

1 1 1.0 
1 2 2.0 
1 3 3.0 
2 1 4.0 
2 2 5.0 
2 3 6.0 
3 1 7.0 
3 2 8.0 
3 3 9.0 

1 1 1.0 
1 3 1.0 
2 2 1.0 
3 1 1.0 
3 2 1.0 
3 3 1.0 

ОЖИДАЕМЫЕ Выход:

A has 9 non-zero entries: 
1: (1, 1.0) (2, 2.0) (3, 3.0) 
2: (1, 4.0) (2, 5.0) (3, 6.0) 
3: (1, 7.0) (2, 8.0) (3, 9.0) 

B has 5 non-zero entries: 
1: (1, 1.0) (3, 1.0) 
3: (1, 1.0) (2, 1.0) (3, 1.0) 

Первая строка содержит следующие данные: 3 = размер матрицы (3 x 3), 9 = количество ненулевых значений для первой матрицы и 6 = количество значений второй матрицы. Следующие 9 наборов строк - это значения, вводимые в первую матрицу. Последние 6 строк - это значения, вводимые во вторую матрицу. Программа анализирует первую строку, 9 значений первой матрицы и 6 значений второй матрицы, ОДНАКО моя программа никогда не заканчивается и не застревает в непрерывном цикле, и я не могу понять, почему любая помощь была бы весьма признательна !

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

class Sparse{ 
    public static void main(String[] args) throws IOException{ 
    Scanner in = null; 
    PrintWriter out = null; 
    String line = null; 
    String[] token = null; 
    int i, j, k, n = 0; 
    int lineNumber = 0; 
    double x = 0; 

    if(args.length < 2){ 
     System.out.println("Usage: FileIO infile outfile"); 
     System.exit(1); 
    } 

    in = new Scanner(new File(args[0])); 
    out = new PrintWriter(new FileWriter(args[1])); 

    int size = in.nextInt(); 
    int nnzA = in.nextInt(); 
    int nnzB = in.nextInt(); 
    Matrix A = new Matrix(size); 
    Matrix B = new Matrix(size); 

    in.nextLine(); 

    for (i = 0; i < nnzA; i++){ 
     j = in.nextInt(); 
     k = in.nextInt(); 
     x = in.nextDouble(); 
     A.changeEntry(j,k,x); 
    } 

    in.nextLine(); 

    while (in.hasNextLine()){ 
     if (in.hasNext()){ 
      j = Integer.parseInt(in.next()); 
      k = Integer.parseInt(in.next()); 
      x = Double.parseDouble(in.next()); 
      B.changeEntry(j,k,x); 
     }else{ 
      in.close(); 
      break; 
     } 
    } 

    out.println("A has " + A.getNNZ() + " non-zero entries:"); 
    out.println(A); 

    out.println("A has " + B.getNNZ() + " non-zero entries:"); 
    out.println(B); 
    } 
} 
+3

Вам следует научиться использовать отладчик! – hivert

+1

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

+2

Пожалуйста, придерживайтесь соглашений об именах Java, переменные находятся в 'camelCase'. Нет необходимости объявлять переменные в верхней части метода - объявлять их, например, где они используются; в случае 'i',' j', 'k' объявляют их в циклах. Это упростит чтение кода. –

ответ

-1

Оказывается, этот вопрос не был в моем разборе, но в одном из моего метода ToString для печати матриц. Функция синтаксического анализа теперь не работает, (я переключился обратно на использование цикла for вместо цикла while во втором цикле).

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