Reprezentarea unui grafic prin liste de adjacență în java

ArrayList[] grafic = noul ArrayList [N];

Faptul este că în Java obiectele nu au numai clasa ci și parametrii clasei, în timp ce parametrii se potrivesc când se apelează metodele și atunci când atribuirea nu este verificată, uneori compilatorul aruncă avertizări și nu știe ce parametru are acest obiect. Puteți crea un ArrayList și alocați-o ArrayList și se va compila. În timpul rulării, se întâmplă următoarele: atunci când apelați metoda parametrizate este verificat faptul că parametrul obiect corespunde parametrului care este de așteptat să acolo, în caz de eșec a generat unele RuntimeException.

Ceva pe care nu l-am observat, că din ea avertismentul "Notă: Main.java folosește operațiuni nechetate sau nesigure" a fost pierdut. Sau este modul în care aceasta ar trebui să rămână, și afirmația că Java este mai bună decât profesioniști, securitatea performanței garantate ar trebui să fie împărțită în 0x100?

Text integral -
[Cut]
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Queue;
import java.util.logging.Level;
import java.util.logging.Logger;

clasa publică principală static int nextInt (StreamTokenizer in) încercați in.nextToken ();
retur (int) in.nval;
> Captura (IOException ex) Logger.getLogger (Main.class.getName ()) log (Level.SEVERE, nul, ex) .;
retur 0;
>
>
public static void principal (String [] args) aruncă FileNotFoundException StreamTokenizer în = new StreamTokenizer (nou FileReader ("input.txt"));
PrintWriter out = noul PrintWriter (fișier nou ("output.txt"));
int TEST_NUM = nextInt (in);
pentru (int the_test = 0; the_test ArrayList[] grafic = noul ArrayList [N];
pentru (int i = 0; i Graficul [i] = noul ArrayList();
pentru (int k = 0; k graf [u] .add (noul Integer (v));
>
int [] st = nou int [N];
int [] d = nou int [N];
Arrays.fill (st, 0);
Arrays.fill (d, 987654321);
int start = nextInt (in);
st [start] = 1;
d [start] = 0;
coadă qqq = ArrayDeque nou();
qqq.add (start);
în timp ce (! qqq.isEmpty ()) int u = qqq.poll ();
pentru (int w. (ArrayList) grafic [u])
dacă (st [w] == 0) qqq.add (w);
st [w] = 1;
d [d] = d [u] +1;
>
>
pentru (int i = 0; i out.print (d [i] + "");
out.println ();
>
out.close ();
>
>

ArrayList[] grafic = noul ArrayList [N];

@SuppressWarnings ("neconfirmat")
ArrayList[] grafic = noul ArrayList [N];

Odată deja, acest avertisment este urât

Nu o mai faceti din nou, folositi ceva de genul ideone sau paste.pocoo.org

În primul rând, generic - sunt adesea întâlniri nesigure și avertisment - și nu puteți ajunge nicăieri. În al doilea rând, în Java 7, compilatorul tratează unele dintre aceste cazuri ca fiind sigure și nu scrie nimic. În al treilea rând, securitatea este atunci când programul nu se încadrează în acțiunea greșită, ci generează o excepție, care este prinsă și procesată. În mod similar, puteți cere să testați posibilitatea de împărțire cu 0 sau alocări de tip Integer x = (Integer) obj;

"securitatea este atunci când programul nu cade din acțiunea greșită, ci generează o excepție, care este prinsă și procesată"
Unde mă înșel greșit, considerând că atunci când o acțiune incorectă nu este omisă de compilator, este și mai sigură?

Puteți schimba compilatorul în general. Prin urmare, toate barierele dvs. pot fi complet evitate prin dezactivarea controalelor la nivelul JVM.

Pentru o explicație a ceea ce să scrieți
ArrayList[] grafic = noul ArrayList [N];
-- Vă mulțumesc foarte mult, se pare că aceasta este întrebarea închisă de 99%.

Și ce despre restul mesajului text - ceva fie prost scris, am citit rău, dar la început nu am înțeles. Am fost foarte supărat de declarația "Puteți crea un ArrayList și alocați-o ArrayList și se va compila. “.

Pentru a le atribui la compilație, trebuie să faceți acest lucru prin conversia la tipul brut:

listă listI = noul LinkedList();
listI.add (7);
Listă listă = listI;
listă listS = list;
listS.add ("Java");
System.out.println (listS);

Când compilați, nu va exista nici o eroare, dar va exista un avertisment care poate fi văzut cu -XLint: neînchis

Acest lucru se face pentru compatibilitatea cu versiunile mai vechi (înainte de a 5-a Java).

Eu însumi am scris de obicei pe vectorul de pluses> dar cumva auzit recent acel vector> tipul este mai eficient. El însuși nu a observat acest lucru, dar din anumite motive a crezut. În listă, pentru că, probabil, o mulțime de memorie merge la pointeri, memoria probabil acum (și nu doar acum 15 ani) nu este alocată prin octet ci prin câteva paragrafe sau chiar prin ce porțiuni etc.
Cu toate acestea, ArrayList sau LinkedList nu pare să afecteze esența problemei principale.

Ce nu se potrivește matricei ArrayList?
Se pare mai ușor să se implementeze o operație cu un grafic.
Despre performanța este aproximativ aceeași, dar, în general, listele de contiguitate au avantajul potențial că adiacent la partea superioară a coastelor sunt coerente, spre deosebire de o listă mare, unde nu există o astfel de comandă.
Dacă doriți să finalizeze îndepărtarea coastelor, este posibil, în analogie pentru a face o matrice HashSet'ov dacă performanța nu este foarte important.
O întrebare interesantă este cum să faceți o structură rapidă pentru adăugarea / eliminarea marginilor / vârfurilor.

Articole similare