Я пытаюсь прочитать некоторые файлы csv и построить график, но продолжаю получать это сообщение:
Exception in thread "main"
java.lang.ArrayIndexOutOfBoundsException:
Index 736 out of bounds for length 500
at CitiesClass.main(CitiesClass.java:35)
это, по-видимому, эта строка
[Integer.parseInt(results[1])]=1.0;
а что именно я делаю не так?
Полный код:
import java.io.*;
import java.util.Scanner;
import java.util.*;
class CitiesClass {
static int N = 500;
static double [][] edges = new double[N][N];
static TreeMap <Integer,String> cityNames = new TreeMap
<Integer,String>();
static ArrayList<String> convert(ArrayList<Integer> m) {
ArrayList<String> z = new ArrayList<String>();
for (Integer i:m) z.add(cityNames.get(i));
return z;
}
static HashSet<ArrayList<String>> convert
(HashSet<ArrayList<Integer>> paths) {
HashSet <ArrayList <String>> k = new HashSet <ArrayList<String>>();
for (ArrayList <Integer> p:paths) k.add(convert(p));
return k;
}
public static void main(String[] args) throws Exception {
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
edges[i][j]=0.0;
Scanner s = new Scanner(new FileReader("randomGraph.csv"));
String z = s.nextLine();
while (s.hasNext()) {
z =s.nextLine();
String[] results = z.split(",");
edges[Integer.parseInt(results[0])]
[Integer.parseInt(results[1])]=1.0;
edges[Integer.parseInt(results[1])]
[Integer.parseInt(results[0])]=1.0;
}
s = new Scanner(new FileReader("cities.csv"));
z =s.nextLine();
while (s.hasNext()) {
z =s.nextLine();
String[] results = z.split(",");
cityNames.put(Integer.parseInt(results[0]), results[1]);
}
graph G = new graph(edges);
int st = Integer.parseInt(args[0]);
int fin = Integer.parseInt(args[1]);
System.out.println("Shortest path from " + cityNames.get(st)
+ " to " + cityNames.get(fin) + " is" +
convert(G.shortestPaths(st,fin)));
}
}
@ luk2302 Я вижу, но не понимаю как.




but what exactly am I doing wrong?
Вы предполагаете, что 0 <= Integer.parseInt(results[1]) < 500. Ясно, что вы читаете граф как минимум с 736 узлами (или 737, если индексы графа отсчитываются от нуля).
Я мог бы посмотреть, содержит ли первая строка randomGraph (та, которую вы отбрасываете) размер графика.
String z = s.nextLine();
Попробуйте разобрать это:
int graphSize = Integer.parseInt(z);
а затем выделяя вашу матрицу на основе этого:
edges = new double[graphSize][graphSize]
Выдает ошибку: Exception in thread "main" java.lang.NumberFormatException: For input string: "4,752,45.97182"
Хорошо, похоже, там больше данных, чем просто количество узлов. 752 выглядит уместно; понятия не имею, что такое 4 и 45. мля. Итак, разделите его (как вы делаете) и проанализируйте соответствующую часть.
Я считаю, что строка выше — это первая строка в файле, а 736 — вторая. До сих пор не знаю, почему это не работает.
Да: 752 находится в первой строке. Извлеките этот как-то, используйте его для инициализации вашего массива. Затем, когда вы анализируете 736 во второй (или любой последующей) строке, ваш массив достаточно велик.
сообщение об исключении плюс
int N = 500казаться связаны.