2015-05-07 2 views
1

У меня два текстовых файла с данными в форматеJAVA: файл I/O

data.txt файла в следующем формате

A 10 
B 20 
C 15 

data1.txt файл находится в формате (начальный узел, конечный узел, расстояние):

A B 5 
A C 10 
B C 20 

Я пытаюсь реализовать стратегию поиска, для этого нужно загрузить данные из data.txt и только узел и конец начала узел от data1.txt (т.е. Мне не нужно расстояние). Мне нужно сохранить эту информацию в стеке, поскольку я думаю, что это была бы лучшая структура данных для реализации жадного поиска.

На самом деле я не уверен, как начать работу с файлами ввода/вывода, чтобы прочитать эти файлы и сохранить их в массиве для реализации жадного поиска. Поэтому я был бы очень признателен за любую начальную идею о том, как действовать.

Я новичок в этом, поэтому, пожалуйста, несите меня. Буду признателен за любую оказанную помощь. Благодарю.

EDIT: Вот что у меня до сих пор

String heuristic_file = "data.txt"; 
try 
    {   

     FileReader inputHeuristic = new FileReader(heuristic_file); 
     BufferedReader bufferReader = new BufferedReader(inputHeuristic); 
     String line; 

     while ((line = bufferReader.readLine()) != null) 
     { 
      System.out.println(line); 
     } 

     bufferReader.close(); 

    } catch(Exception e) { 
     System.out.println("Error reading file " + e.getMessage()); 
    } 
+0

создать BufferedReader и использовать его метод ReadLine прочитать файл построчно: 'BufferedReader читатель = новый BufferedReader (новый FileReader (новый файл (YOUR_FILE_PATH_HERE)))'; а затем используйте 'reader.readLine()' для чтения строки – alainlompo

+0

Фактически я знаю это, но я не уверен, как сохранить его в стеке и, в частности, только начальный и конечный узел (не расстояние) от 'data1.txt' file – Dee

+0

@alainlompo Я добавил код сейчас. Пожалуйста, смотрите. – Dee

ответ

0

использование разделенное

  while ((line = bufferReader.readLine()) != null) 
      { 
       String[] tokens = line.split(" "); 
       System.out.println(line + " -> [" + tokens[0] + "]" + "[" + tokens[1] + "][" + tokens[2] + "]"); 
      } 

если вы должны иметь это в массиве вы можете использовать следующее:

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileReader; 
import java.io.IOException; 
import java.text.ParseException; 
import java.util.ArrayList; 
import java.util.List; 

public class NodeTest { 

    public static void main(String[] args) throws ParseException { 
    try {   
     File first = new File("data.txt"); 
     File second = new File("data1.txt");  

     Node[] nodes1 = getNodes(first); 
     Node[] nodes2 = getNodes(second); 

     print(nodes1); 
     print(nodes2); 
    } 
    catch(Exception e) { 
     System.out.println("Error reading file " + e.getMessage()); 
    } 
    } 

    public static final void print(Node[] nodes) { 
    System.out.println("======================"); 
    for(Node node : nodes) { 
     System.out.println(node); 
    } 
    System.out.println("======================"); 
    } 

    public static final Node[] getNodes(File file) throws IOException { 
    FileReader inputHeuristic = new FileReader(file); 
    BufferedReader bufferReader = new BufferedReader(inputHeuristic); 
    String line; 
    List<Node> list = new ArrayList<Node>(); 
    while ((line = bufferReader.readLine()) != null) { 
     String[] tokens = line.split(" "); 
     list.add(new Node(tokens[0], tokens[1]));    
    } 
    bufferReader.close(); 
    return list.toArray(new Node[list.size()]); 
    } 
} 

class Node { 
    String start; 
    String end; 

    public Node(String start, String end){ 
    this.start = start; 
    this.end = end; 
    } 

    public String toString() { 
    return "[" + start + "][" + end + "]"; 
    } 
} 
+0

Спасибо! Я нашел это простейшим и понятным! – Dee

0

Что-то вроде этого?

HashSet<String> nodes = new HashSet<String>(); 
try(BufferedReader br = new BufferedReader(new FileReader("data.txt"))) { 
    String line = br.readLine(); 
    while (line != null) { 
     String[] l = line.split(" "); 
     nodes.add(l[0]); 
     line = br.readLine(); 
    } 
} 

try(BufferedReader br = new BufferedReader(new FileReader("data1.txt"))) { 
    String line = br.readLine(); 
    while (line != null) { 
     String[] l = line.split(" "); 
     if (nodes.contains(l[0]) || nodes.contains(l[1])) 
      // Do whatever you want ... 
     line = br.readLine(); 
    } 
}  
1

Мой подход, принципиально не отличается от других. Пожалуйста, обратите внимание на блоки try/catch/finally. Всегда помещайте заключительные операторы в блок finally, поэтому открытый файл гарантированно закрывается, даже если при чтении файла было выбрано исключение.

Часть между двумя // [...] может быть выполнена более эффективно. Может быть, прочитав весь файл за один раз, а затем разобрав текст в обратном направлении и поиская перерыв? Возможно, Stream-API поддерживает настройку позиции чтения. Честно говоря, я не знаю. Мне это не нужно, до сих пор.

Я решил использовать многословную инициализацию BufferedReader, потому что тогда вы можете указать ожидаемую кодировку файла. В вашем случае это не имеет значения, так как ваши файлы не содержат символов из стандартного диапазона ASCII, но я считаю, что это полу-лучшая практика.

Прежде чем вы спросите: r.close() позаботится о закрытии базовых InputStreamReader и FileInputStream в правильном порядке, пока все считыватели и потоки не будут закрыты.

public static void readDataFile(String dir, String file1, String file2) 
    throws IOException 
{ 
    File datafile1 = new File(dir, file1); 
    File datafile2 = new File(dir, file2); 

    if (datafile1.exists()) 
    { 
     BufferedReader r = null; 

     try 
     { 
      r = new BufferedReader(
       new InputStreamReader(
        new FileInputStream(datafile1), 
        "UTF-8" 
       ) 
      ); 

      String row; 

      Stack<Object[]> s = new Stack<Object[]>(); 
      String[] pair; 
      Integer datapoint; 

      while((row = r.readLine()) != null) 
      { 
       if (row != null && row.trim().length() > 0) 
       { 
        // You could use " " instead of "\\s" 
        // but the latter regular expression 
        // shorthand-character-class will 
        // split the row on tab-symbols, too 
        pair = row.split("\\s"); 
        if (pair != null && pair.length == 2) 
        { 
         datapoint = null; 
         try 
         { 
          datapoint = Integer.parseInt(pair[1], 10); 
         } 
         catch(NumberFormatException f) { } 

         // Later you can validate datapairs 
         // by using 
         // if (s.pop()[1] != null) 
         s.add(new Object[] { pair[0], datapoint}); 
        } 
       } 
      } 
     } 
     catch (UnsupportedEncodingException e1) { } 
     catch (FileNotFoundException e2) { } 
     catch (IOException e3) { } 
     finally 
     { 
      if (r != null) r.close(); 
     } 
    } 

    // Do something similar with datafile2 
    if (datafile2.exists()) 
    { 
     // [...do the same as in the first try/catch block...] 

     String firstrow = null, lastrow = null; 
     String row = null; 
     int i = 0; 
     do 
     { 
      lastrow = row; 
      row = r.readLine(); 
      if (i == 0) 
       firstrow = row; 
      i++; 
     } while(row != null); 

     // [...parse firstrow and lastrow into a datastructure...] 
    } 
} 
+0

Спасибо за работу 'try catch' и разъяснение потока. – Drew