2017-11-13 3 views
3

ich eine Datei haben, die die folgenden Daten enthält:Filling 2D-Array aus Listen

4 
5 
0 2 

0 1 0.6 
0 2 0.2 
0 3 0.5 
1 3 0.8 
2 3 0.3 

die erste Linie ist die Knoten-Nummer, die zweite Zeile ist Kanten Nummer und der 3. Zeile enthält die Knoten mit speziellen Einschränkungen.

Allerdings habe ich diesen Code verwendet, um es aus der Datei in zwei Listen, Werte und Knoten zu lesen, wobei die Werteliste die Kanten enthält (Beispiel: 0 1 0,6), während die Knotenliste die Werte der 3 Zeilen enthält (4, 5, {0,2}).

Ich brauche zwei Arrays zu konstruieren, ein ein Äquivalent zu Adjazenzmatrix die wie folgt

ist
int graph[][] = { 
      {0, 6, 2, 5}, 
      {6, 0, 0, 8}, 
      {2, 0, 0, 3}, 
      {5, 8, 3, 0} 
     }; 

und das andere Array ist die spezielle Knoten-ID, dh

int special [] ={0,2}; 

I lesen kann, die Werte aus einer Datei und trennen sie in zwei Listen Knoten und Werte in der folgenden Form: Knoten Liste enthält: 4, 5, 0, 2 Werte Liste enthält: 0,1,0,6,0,2,0,2,0, 3,0,5,1,3,0,8,2,3,0,3

Ich habe ein zweidimensionales Array namens graph2 deklariert, um die Werte aus den Listen zu speichern. Aber das Problem ist, dass ich die Beziehung nicht finden kann, um Daten aus der Werteliste zu füllen, um in das Diagramm2d-Array zu passen. Es muss wie das Diagramm-Array sein, aber seine Initialisierung wäre dynamisch von dieser Datei.

Also, was ich brauche, ist im Grunde zwei Arrays zu erstellen: eins ist wie das Graph-Array (2d-Array) und das andere ist wie spezielle Array (1d). Basierend auf der Datei muss ich das tun. Vielen Dank im Voraus

Mein Code:

List<Double> values = new ArrayList<>(); 
     List<Integer> nodes = new ArrayList<>(); 
     int c = 0; 
     File file = new File("text.txt"); 
     BufferedReader reader = null; 
     try { 
      reader = new BufferedReader(new FileReader(file)); 
      String text = null; 

      while ((text = reader.readLine()) != null) { 
       if (c <= 2) { 

        String[] str = text.split(" "); 
        for (int i = 0; i < str.length; i++) { 
         if (str[i].trim().length() > 0) { 
          nodes.add(Integer.parseInt(str[i])); 
         } 
        } 
        c++; 
       } else { 

        String[] str = text.split(" "); 
        for (int i = 0; i < str.length; i++) { 
         if (str[i].trim().length() > 0) { 
          values.add(Double.parseDouble(str[i])); 
         } 
        } 
       } 

      } 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       if (reader != null) { 
        reader.close(); 
       } 
      } catch (IOException e) { 
       System.out.print(e); 
      } 
     } 
     double graph2 [] [] =new double [nodes.get(0)][nodes.get(0)]; 
+0

Ich verstehe nicht, was Sie tun möchten, möchten Sie aus der Datei direkt in Ihrem 2d-Array lesen? –

+0

@JoachimHuet überprüfen Sie bitte meine Bearbeitung. –

+0

Haben Sie einen neuen Account für den nächsten Teil dieser Frage erstellt: https://stackoverflow.com/questions/47265100/how-to-read-this-from-file-and-get-each-value-alone – notyou

Antwort

0

Der folgende Code wird den 2D-Array aus der Datei (nicht die adjacency Karte, die Sie dann ganz einfach selbst erstellen) erstellen

nodes wird nur die enthalten Spezielle Knoten und Graph2 enthält die Kantenbeschreiber.

(NB: Ich habe nicht testen Sie es mich so sagen, wenn etwas schief geht)

List<Double> values = new ArrayList<>(); 
List<Integer> nodes = new ArrayList<>(); 
int c = 0; 
File file = new File("text.txt"); 
BufferedReader reader = null; 

double[][] graph2 = null;  

try { 
    reader = new BufferedReader(new FileReader(file)); 
    String text = null; 
    while ((text = reader.readLine()) != null) { 
     // The first line gives the number of nodes (You will use to create the int[][] graph = new int[nOfNodes][nOfNodes];) 
     if (c == 0) { 
      numberOfNodes = Integer.parseInt(text.trim()); 
     } 
     // The second one gives the number of edges 
     else if (c == 1) { 
      nOfEdges = Integer.parseInt(text.trim()); 
      graph2 = new double[nOfEdges][3]; 
     } 
     // And third the list of special nodes 
     // `nodes` will now contains only your special constrained one 
     else if (c == 2) { 
      String[] str = text.split(" "); 
      for (int i = 0; i < str.length; i++) { 
       if (str[i].trim().length() > 0) { 
        nodes.add(Integer.parseInt(str[i])); 
       } 
      } 
     } else { // Then you have your edges descriptors 
      String[] str = text.split(" "); 
      for (int i = 0; i < str.length; i++) { 
       if (str[i].trim().length() > 0) { 
        graph2[c-4][i] = Double.parseDouble(str[i]);      
       } 
      } 
     } 
     c++; 
    } 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} finally { 
    try { 
     if (reader != null) { 
      reader.close(); 
     } 
    } catch (IOException e) { 
     System.out.print(e); 
    } 
} 

Dann wird Ihr erstellen Sie es auf Null initialisieren und dann Schleife über graph2 um es zu füllen.

+0

Nun, danke zuerst, aber dieser Code ist falsch, es gibt einen Fehler in dieser Zeile graph2 [c - 3] [i] = Double.parseDouble (str [i]); –

+0

@SUBHIALMOHTASIB Welcher Fehler ist es? –

+0

Ausnahme im Thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 \t bei javaapplication6.JavaApplication6.main –