我正在输入图的邻接表。三列数据(顶点,目标,边)由单个空格分隔。到目前为止,这是我的实现:

         FileStream in = new FileStream("input1.txt");
         Scanner s = new Scanner(in);

         String buffer;
         String [] line = null;
        while (s.hasNext())
        {
            buffer = s.nextLine();
            line = buffer.split("\\s+");
            g.add(line[0]);
            System.out.println("Added vertex " + line[0] + ".");
            g.addEdge(line[0], line[1], Integer.parseInt(line[2]));
            System.out.println("Added edge from " + line[0] + " to " + line[1] + " with a weight of " + Integer.parseInt(line[2]) + ".");
         }

         System.out.println("Size of graph = " + g.size());


这是输出:

Added vertex a.
Added edge from a to b with a weight of 9.
Exception in thread "main" java.lang.NullPointerException
    at structure5.GraphListDirected.addEdge(GraphListDirected.java:93)
    at Driver.main(Driver.java:28)


我的印象是

 line = buffer.split("\\s+");


将字符串的二维数组返回到变量line。它似乎第一次工作,但第二次却没有。有什么想法吗?

我还希望对我对这个问题的执行情况提供一些反馈。有没有更好的办法?
有什么可以帮助新手的! :)

编辑:

我今天早些时候尝试了此实现,但未成功。我在这里再次做了:

FileStream in = new FileStream("input1.txt");
             Scanner s = new Scanner(in).useDelimiter("\\s+");

            while (s.hasNext())
            {
                Scanner line = new Scanner(s.nextLine());
                String vertex = line.next();
                String destination = line.next();
                int weight = line.nextInt();
                g.add(vertex);
                System.out.println("Added vertex " + vertex + ".");
                g.addEdge(vertex, destination, weight);
                System.out.println("Added edge from " + vertex + " to " + destination + " with a weight of " + weight + ".");
             }

             System.out.println("Size of graph = " + g.size());


输出:

Added vertex a.
Exception in thread "main" java.lang.NullPointerException
    at structure5.GraphListDirected.addEdge(GraphListDirected.java:93)
    at Driver.main(Driver.java:22)


编辑2:

这是addEdge函数。这不是我自己的实现,我正在使用它来节省在开始阶段花一些时间编写我自己的时间……

package structure5;
import java.util.Iterator;


abstract public class GraphList<V,E> extends AbstractStructure<V> implements Graph<V,E>
{
    protected Map<V,GraphListVertex<V,E>> dict; // label -> vertex

    protected boolean directed; // is graph directed?


    protected GraphList(boolean dir)
    {
        dict = new Hashtable<V,GraphListVertex<V,E>>();
        directed = dir;
    }

    public void add(V label)
    {
        if (dict.containsKey(label)) return; // vertex exists
        GraphListVertex<V,E> v = new GraphListVertex<V,E>(label);
        dict.put(label,v);
    }


    abstract public void addEdge(V v1, V v2, E label);
}


Graph.java:

package structure5;
import java.util.Iterator;

public interface Graph<V,E> extends Structure<V>
{
    public void add(V label);


    public void addEdge(V vtx1, V vtx2, E label);
}


注意:我遗漏了与程序无关的其余方法

编辑3:
这是GraphListDirected.java

public class GraphListDirected<V,E> extends GraphList<V,E>
{
    public GraphListDirected()
    {
        super(true);
    }
    public void addEdge(V vLabel1, V vLabel2, E label)
    {
        GraphListVertex<V,E> v1 = dict.get(vLabel1);
        GraphListVertex<V,E> v2 = dict.get(vLabel2);
        Edge<V,E> e = new Edge<V,E>(v1.label(), v2.label(), label, true);   //Line 93
        v1.addEdge(e);
    }

最佳答案

String.split返回一个String[],一维数组,从不返回二维数组。当然,您可以进一步split一个Stringsplit的结果(依此类推)。

话虽如此,由于您已经在使用Scanner,因此您永远不需要使用splitInteger.parseInt等。只需创建另一个Scanner来扫描s.nextLine()

Scanner line = new Scanner(s.nextLine());
String from = line.next();
String to = line.next();
int weight = line.nextInt();


我不确定是什么原因导致了NullPointerException,尽管我们从您的输出中知道至少成功添加了一条边。

API链接


Scanner(String source)


构造一个新的Scanner,该Scanner生成从指定字符串扫描的值。





在多个split

小阿哈!现在,您意识到,就像您可以根据先前的split的结果Scanner一样,可以创建Scanner来扫描从另一个NullPointerException返回的字符串。

    String inputText =
        "Line1 a b\n" +
        "Line2 d e f\n" +
        "Line3";
    Scanner input = new Scanner(inputText);
    while (input.hasNext()) {
        Scanner line = new Scanner(input.nextLine());
        System.out.println("[" + line.next() + "]");
        while (line.hasNext()) {
            System.out.println("  " + line.next());
        }
    }


上面的片段打印:

[Line1]
  a
  b
[Line2]
  d
  e
  f
[Line3]


这只是一个简单的示例,但是当每一行都比较复杂时,例如,您可以看到此技术的价值。当它包含数字和正则表达式模式时。



add

由于实现addEdge的方式,您需要同时NullPointerException起点和终点。

            Scanner line = new Scanner(s.nextLine());
            String vertex = line.next();
            String destination = line.next();
            int weight = line.nextInt();
            g.add(vertex);
            g.add(destination); // <--- ADD THIS LINE!!
            g.addEdge(vertex, destination, weight);


这应该修复。

希望发现此错误的过程具有教育意义:对该问题进行了多次修改以收集相关信息,但最终确定了错误的罪魁祸首。

关于java - Java:使用拆分从文件输入文本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2901964/

10-13 02:41