0

Я хочу, чтобы найти все циклы в графике и использование этого решения Finding all cycles in undirected graphsразница между различными декларациями массива в Java

алгоритма работает нормально, но я хочу передать двумерный массив в качестве аргумента, но приходит в задаче:

данный граф объявлен как

static int[][] graph = 
    { 
     {1, 7}, {1, 8}, {7, 8}, {2, 3}, 
     {3, 4}, {6, 4}, 
     {7, 6}, {8, 7} 
    }; 

и она работает, но я использовал

int[][] intGraph = new int[500][4]; 
..... 
intGraph[j][0] = Integer.parseInt(edge[i]); 
intGraph[j][1] = Integer.parseInt(edge[i+1]); 
intGraph[j][2] = Integer.parseInt(edge[i+2]); 
.... 

оба значения массива я могу Хороший доступ через arrayname[x][y]

, но когда я пытаюсь передать его в качестве аргумента в: (все алгоритма в ссылке выше)

public GraphCycleFinder(int[][] graphs) { 
    graph = graphs; 

    for (int i = 0; i < graph.length; i++){ 
     System.out.println(i);    //added to check itterations 
     for (int j = 0; j < graph[i].length; j++) 
     { 
      //System.out.print(graph[i][j]); 
      findNewCycles(new int[] {graph[i][j]}); 
     } 
} 

Я не получить никакого результата, нет ошибок , Когда я печатаю значения i (чтобы проверить, насколько далеко он итерации), он дает мне 0, когда он проходит через мой массив (но должен быть от 0 до 500), но печатает от 0 до длины массива этого жестко запрограммированного массива.

Я полагаю, что есть что-то с признаниями массива, потому что я попытался

int[][] intGraph; 

, а затем положить значения как

intGraph[j][0] = Integer.parseInt(edge[i]); 

, но я получил java.lang.NullPointerException

Любые идеи?

P.s. извините, если слишком глупый вопрос, я новичок в java.

UPDATE

Проблема не с описания массива. Я прокомментировал findNewCycles(new int[] {graph[i][j]});, и циклы bouth дали необходимый результат. Вероятно, метод findNewCycles в этом алгоритме не может справиться с этим большим массивом. :(хотя только 200 вершин и 500 ребер. Не так много.

+0

Похоже, что либо 'edge', либо' edge [i] 'являются' null', но мы не можем сказать без трассировки стека. – CodeBlind

+0

Вы инициализировали 'intGraph [j]'? Массивы на Java - это объекты, поэтому 'int [] []' - это массив объектов, каждый из которых является массивом целочисленных примитивов. – shoover

+0

Этот массив intGraph заполнен значениями, поэтому я полагаю, что край или край [i] не равен NULL. И я попытаюсь выяснить, как получить трассировку стека: D –

ответ

1

Вот некоторые моменты, которые могут помочь вам (я надеюсь, что они делают то)

массива Объявления, как для названия вопроса

В Java вы можете объявить массив двумя способами

  1. переменной массива типа данных (например, тип INT массив)

    int[] a,b; //both a and b are of integer array type

  2. массив переменной некоторого типа данных (например Int)

    int c[],d; //both c and d are of int type but only c is array

Initialization, поскольку требуется Мы можем объявить и инициализировать массив следующим

int[] a = {1, 2, 3, 4, 5}; 
     // or 
int b[][] = {{1, 2, 3}, {4, 5, 6}, {1, 3, 5}, {2, 4, 6}}; 

Мы может инициализировать объявленный массив следующим образом:

a[0] = 1; 
a[1] = 2*a[0]; //or any other expression 

Вещи, которые вы пропустили в вопросе или, возможно, не хватает в вашем коде/проблемы

  • является массив ребер и ребра имеют две вершины и, следовательно, intGraph[500][4] должны быть intGraph[500][2]
  • public GraphCycleFinder(int[][] graphs) {...} должен быть static если вы звоните в main() и при последнем закрытии } отсутствует, как описано выше.
  • Как указано, вы также должны инициализировать intGraph[j].

Под этим мы имеем в виду в коде

..... 
intGraph[j][0] = Integer.parseInt(edge[i]); 
intGraph[j][1] = Integer.parseInt(edge[i+1]); 
intGraph[j][2] = Integer.parseInt(edge[i+2]); 
.... 

вы только инициализирует одно измерение в пределах одной строки или, например, если у = 1, то вы инициализации intGraph [1] [0] до [intGraph 1] [3] только не для всех у = 0 до 499, за исключением 1.

и наиболее вероятно NPE встречается, потому что с int [][]intGraph; вы не инициализирует его все элементы и пытается скопировать неинициализированный массив в функции public GraphCycleFinder(int[][] graphs){graph=graphs;...} , и вы не получаете его при использовании int [][]intGraph=new int[500][4];, потому что вы инициализируете все элементы и не имеет значения NULL.

Надеюсь, что это поможет!

+0

Спасибо за объяснение массивов! Теперь это намного яснее! Но в любом случае 'intGraph [j] [0] = Integer.parseInt (edge ​​[i]);' i loop throuht и 'j' - от 0 до 500, а значения присваиваются всем элементам. и здесь 'intGraph [500] [2]' i использует 4 insted из 2, потому что мне нужно сохранить значение веса края, а 4th - 0 или 1 (основные детали задачи). И 'public GraphCycleFinder (int [] [] graphs) {...}' Я не звоню в main(), это в другой конструктор класса. :) И еще раз спасибо за подробную информацию о массивах! –

+0

добро пожаловать. И если вы можете поделиться другим кодом, тогда, возможно, мы поймем, в чем проблема. – learning

+0

Это действительно грязно сейчас, я попробую очистить его, может быть, найдет проблему. Если я этого не сделаю, я поделюсь чистым кодом :) –

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