Tengo problemas de compilación de Java. Aunque he configurado mi classpath correctamente como se ve aquí ...

yan@Y9Acer:~$ echo $CLASSPATH
.:/usr/local/lift/lib/stdlib.jar:/usr/local/lift/lib/introcs.jar:/usr/local/lift/lib/algs4.jar

Todavía obtengo los siguientes errores StdIn y StdOut al compilar, lo que indica que no se encontraron los símbolos. Pero estos se encontrarían en el archivo stdlib.jar mencionado anteriormente, por lo que no sé por qué sucede esto. ¿Alguien sabe a que se debe esto? He buscado durante horas y no he llegado a ninguna parte.

yan@Y9Acer:~$ javac-algs4 coursera/java-stuff/markov/Markov.java
coursera/java-stuff/markov/Markov.java:17: error: cannot find symbol
        int n = StdIn.readInt();                 // number of pages
                ^
  symbol:   variable StdIn
  location: class Markov
coursera/java-stuff/markov/Markov.java:18: error: cannot find symbol
        StdIn.readInt();                         // ignore integer required by input format
        ^
  symbol:   variable StdIn
  location: class Markov
coursera/java-stuff/markov/Markov.java:26: error: cannot find symbol
                p[i][j] = StdIn.readDouble();
                          ^
  symbol:   variable StdIn
  location: class Markov
coursera/java-stuff/markov/Markov.java:47: error: cannot find symbol
            StdOut.printf("%8.5f", rank[i]);
            ^
  symbol:   variable StdOut
  location: class Markov
coursera/java-stuff/markov/Markov.java:49: error: cannot find symbol
        StdOut.println();
        ^
  symbol:   variable StdOut
  location: class Markov
coursera/java-stuff/markov/Markov.java:51: error: cannot find symbol
        StdOut.println();
        ^
  symbol:   variable StdOut
  location: class Markov
coursera/java-stuff/markov/Markov.java:54: error: cannot find symbol
            StdOut.printf("%2d  %5.3f\n", i, rank[i]);
            ^
  symbol:   variable StdOut
  location: class Markov
7 errors

Y aquí está mi código, para que puedan ver

import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;

public class Markov {

        public static void main(String[] args) {
            int trials = Integer.parseInt(args[0]);  // number of iterations
            int n = StdIn.readInt();                 // number of pages
            StdIn.readInt();                         // ignore integer required by input format


            // Read p[][] from StdIn.
            double[][] p
                    = new double[n][n];         // p[i][j] = prob. surfer moves from page i to page j
            for (int i = 0; i < n; i++)
                for (int j = 0; j < n; j++)
                    p[i][j] = StdIn.readDouble();

            // Use the power method to compute page ranks.
            double[] rank = new double[n];
            rank[0] = 1.0;
            for (int t = 0; t < trials; t++) {

                // Compute effect of next move on page ranks.
                double[] newRank = new double[n];
                for (int j = 0; j < n; j++) {
                    //  New rank of page j is dot product of old ranks and column j of p[][].
                    for (int k = 0; k < n; k++)
                        newRank[j] += rank[k] * p[k][j];
                }

                // Update page ranks.
                rank = newRank;
            }

            // print page ranks
            for (int i = 0; i < n; i++) {
                StdOut.printf("%8.5f", rank[i]);
            }
            StdOut.println();

            StdOut.println();
            // print page ranks
            for (int i = 0; i < n; i++) {
                StdOut.printf("%2d  %5.3f\n", i, rank[i]);
            }
        }
    }

¿Nadie? No creo que esta sea una pregunta difícil para un tipo Java experimentado.

-1
Glassjawed 10 may. 2019 a las 07:43

4 respuestas

La mejor respuesta

Puede trabajar como si fuera 1999 y agregar manualmente archivos JAR a classpath, o puede reconocer que es 2019 y usar una herramienta de compilación como Maven o Gradle para hacerlo por usted. El algs4 JAR está disponible en BinTray. https://github.com/kevin-wayne/algs4/blob/ master / README.md.

Tomé este curso y usé Gradle para construir el código. Una vez que configura el proyecto, puede concentrarse en resolver los problemas reales y no manipular classpath. También comencé una iniciativa para organizar mejor el código fuente de algs4 (actualmente una estructura plana debido a razones históricas) pero no tuve tiempo para terminarlo.

1
Abhijit Sarkar 11 may. 2019 a las 18:32

El comando javac-introcs se usa con el libro Introducción a la informática: un enfoque interdisciplinario . El comando javac-algs4 se usa con el libro Algorithms, 4e . El primero usa el paquete predeterminado, por lo que no se requiere ninguna declaración de importación; este último utilizó un paquete con nombre y se requieren declaraciones de importación. Entonces, en su caso, use javac-introcs y todo debería funcionar.

No es necesario establecer la variable de entorno CLASSPATH cuando se usa cualquiera de los comandos.

1
classpath 10 may. 2019 a las 09:29

Esto se soluciona poniendo

# this must match the install directory LIFT_LIB="/usr/local/lift/lib"

export CLASSPATH="${CLASSPATH}:${LIFT_LIB}/stdlib.jar:${LIFT_LIB}/introcs.jar:${LIFT_LIB}/algs4.jar" en mi archivo .bashrc. La razón por la que no funcionó fue porque no utilicé el comando export en mi .bashrc.

0
Glassjawed 10 may. 2019 a las 09:39

En mi humilde opinión, esta es una crítica injusta del curso. Las instrucciones para instalar el entorno de programación simplificado (https://introcs.cs.princeton.edu/ java / home /) lo guiará a través de los pasos y funcionará correctamente, al menos en la sección de Linux.

Parece que @Glassjawed no pudo usar los comandos javac-introcs & java-introcs que están habilitados cuando se instala el elevador.

0
Clyde R 11 may. 2019 a las 18:00