Java реализация алгоритма показывает ошибку - PullRequest
1 голос
/ 16 июня 2020

Я пытаюсь реализовать java для алгоритма Дейкстры (дерево кратчайшего пути). Узел графа считывается из текстового файла, который содержит строку | (вершина) и int (вес) между вершинами. Но при запуске программы мне выдали ошибку

Exception in thread "main" java.util.InputMismatchException

>at java.util.Scanner.throwFor(Unknown Source)

>at java.util.Scanner.next(Unknown Source)

>at java.util.Scanner.nextInt(Unknown Source)

>at java.util.Scanner.nextInt(Unknown Source)

>at ASD4_dijkstra.main(ASD4_dijkstra.java:94)

Это код java

import java.io.File;

import java.io.FileNotFoundException;

import java.util.Scanner;



public class ASD4_dijkstra {



    // A utility function to find the vertex with minimum distance value,

    // from the set of vertices not yet included in shortest path tree

    static final int V = 5;

    int minDistance(int dist[], Boolean sptSet[]) {

        // Initialize min value

        int min = Integer.MAX_VALUE, min_index = -1;



        for (int v = 0; v < V; v++)

            if (sptSet[v] == false && dist[v] <= min) {

                min = dist[v];

                min_index = v;

            }



        return min_index;

    }



    // A utility function to print the constructed distance array

    void printSolution(int dist[], int n) {

        System.out.println("Distance from starting vertex");

        for (int i = 0; i < V; i++)

            System.out.println(i + " \t\t " + dist[i]);

    }



    // Funtion that implements Dijkstra's single source shortest path

    // algorithm for a graph represented using adjacency matrix

    // representation

    void dijkstra(int graph[][], int src) {

        int dist[] = new int[V]; // The output array. dist[i] will hold

        // the shortest distance from src to i



        // sptSet[i] will true if vertex i is included in shortest

        // path tree or shortest distance from src to i is finalized

        Boolean sptSet[] = new Boolean[V];



        // Initialize all distances as INFINITE and stpSet[] as false

        for (int i = 0; i < V; i++) {

            dist[i] = Integer.MAX_VALUE;

            sptSet[i] = false;

        }



        // Distance of source vertex from itself is always 0

        dist[src] = 0;



        // Find shortest path for all vertices

        for (int count = 0; count < V - 1; count++) {

            // Pick the minimum distance vertex from the set of vertices

            // not yet processed. u is always equal to src in first

            // iteration.

            int u = minDistance(dist, sptSet);



            // Mark the picked vertex as processed

            sptSet[u] = true;



            // Update dist value of the adjacent vertices of the

            // picked vertex.

            for (int v = 0; v < V; v++)



                // Update dist[v] only if is not in sptSet, there is an

                // edge from u to v, and total weight of path from src to

                // v through u is smaller than current value of dist[v]

                if (!sptSet[v] && graph[u][v] != 0 &&

                    dist[u] != Integer.MAX_VALUE &&

                    dist[u] + graph[u][v] < dist[v])

                    dist[v] = dist[u] + graph[u][v];

        }



        // print the constructed distance array

        printSolution(dist, V);

    }



    // Driver method

    public static void main(String[] args) {

        File file = new File("C:\\Users\\leotr\\Downloads\\alg4.txt");

        try {



            Scanner sc = new Scanner(file);

            int graph[][] = new int[5][5];

            for (int i = 0; i < 5; i++) {

                for (int j = 0; j < 5; j++) {

                    graph[i][j] = sc.nextInt();

                }

            }

            sc.close();

        } catch (FileNotFoundException e) {

            e.printStackTrace();

        }

    }



}

Я искал в гугле и нашел причину ошибки. Это потому, что текстовый файл содержит int и string, а в коде объявлено, что он получает только int, но не может понять, как изменить код, чтобы заставить работать.

EDIT:

text file

    5// number of nodes into graph

    A,B-6,C-1//name of node and connection with other nodes , and her weight

    B,A-6,C-3,D-7,E-2

    C,A-1,B-3,D-1

    D,B-7,C-1,E-2

    E,B-2,D-2 

Первая строка файла означает количество узлов в графе, а другие строки представляют имена узла и связи с другими узлами, а также вес соединения.

Например, A , B-12, C -5 означает соединение A с B, и вес этого соединения равен 12, узел a соединяется с узлом c, а вес равен 5.

Мой вопрос в том, что делать измените l oop (main void), чтобы программа работала (прочтите текстовый файл и вычислите дерево кратчайших путей)

1 Ответ

0 голосов
/ 16 июня 2020

Вы используете nextInt () для ввода, который содержит не только целые числа, но и другие символы, такие как запятые и буквы. Вам нужно разделить целые числа и текст.

Я бы сделал это go с помощью String.charAt ();

Вам нужно определить, где начинается каждое число. Например, если предположить, что каждый узел может называться только именем длиной в 1 символ, вы знаете, что существует целое число, в частности целое число, которое вы ищете (поскольку da sh указывает отрицательное значение), на 5-м , 9, 13 и 17 позиции.

Итак, чтобы извлечь указанные c целые числа как символы, вы можете использовать String.charAt () и вставить индексы чисел, которые кратны 4 (поскольку позиция в строке кратные 4 + 1 и строки начинаются с индекса 0).

Чтобы получить само целое число, вы должны использовать String.valueOf () или Integer.parseInt (), где вы можете просто вставить символ в индексы .

Итак, чтобы подвести итог, я бы сделал это следующим образом:

    int nodes = Integer.parseInt(sc.nextLine()); //This takes the first line, the number of nodes and converts it to an integer.
    for(int i = 0; i < nodes; i++){ //This loop will go through each line

        String line = sc.nextLine(); //This extracts each individual line into a string

        for(int j = 4; j < line.length; i+=4){ 
            //This goes through each individual line, through the indexes that are multiples of 4, which we established are the integers you're looking for above.

            String.valueOf(line.charAt(j)); //This returns each integer inside each line in the input text file.

            Integer.parseInt(line.charAt(j)); //This line does the same thing as above.
            /*I'm not sure how to implement this into your algorithm, but I've done the integer extracting bit. 
             * Either of the two lines of code above will give you the integers you're looking for.
            */
        }

    }

Чтобы было ясно, код, который я вам дал, извлекает только целые числа, которые вы ищете, это на самом деле не помещает их туда, где они вам нужны. Надеюсь, это было полезно.

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