Индекс 736 выходит за пределы длины 500

Я пытаюсь прочитать некоторые файлы 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)));
  }
}

сообщение об исключении плюс int N = 500казаться связаны.

luk2302 13.03.2019 16:16

@ luk2302 Я вижу, но не понимаю как.

cup of tae 14.03.2019 06:21
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
285
1

Ответы 1

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"

cup of tae 13.03.2019 16:48

Хорошо, похоже, там больше данных, чем просто количество узлов. 752 выглядит уместно; понятия не имею, что такое 4 и 45. мля. Итак, разделите его (как вы делаете) и проанализируйте соответствующую часть.

Andy Turner 13.03.2019 17:15

Я считаю, что строка выше — это первая строка в файле, а 736 — вторая. До сих пор не знаю, почему это не работает.

cup of tae 14.03.2019 04:49

Да: 752 находится в первой строке. Извлеките этот как-то, используйте его для инициализации вашего массива. Затем, когда вы анализируете 736 во второй (или любой последующей) строке, ваш массив достаточно велик.

Andy Turner 14.03.2019 10:26

Другие вопросы по теме