我正在尝试使用链接列表从文本文件中整理数据,然后按数字顺序将其重写为另一个预先存在的文本文件。 不过,我一直得到一个nullpointer异常。 有人可以查看我的代码并告诉我缺少什么吗?
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.OutputStream;
import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
public class Sort{
public static void main(String[] args){
String infileName=args[0];
String outfileName=args[1];
try{
BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(new File(infileName))));
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(outfileName))));
Node linkedList=new Node();
//linkedList.value=Integer.parseInt(br.readLine());
String tempS=br.readLine();
while(tempS!=null){
tempS=br.readLine();
Node tempNode=new Node();
linkedList=tempNode;
tempNode.value=Double.parseDouble(br.readLine());
tempNode.next=linkedList;
bw.write(tempNode.next+"\n");
}
bw.flush();
bw.close();
}catch(IOException ioe){ioe.getMessage();}
}
}
class Node{
Double value;
Node next=null;
}
答案 0 :(得分:0)
您要删除每个新行的linkedList
作业。这不是LinkedList,您应该只创建LinkedList,然后.Add为它添加新节点。
从循环中删除linkedList=tempNode;
。并且仅使用tempNode
node.next
添加到最新的lastNode.next = tempNode;
答案 1 :(得分:0)
在while循环中,看起来你正在读取一行进入tempS,但是当你初始化tempNode时,你正在读另一行(这可能会让你根据一般猜测运行文件的末尾) -
然后你在第二个readLine上调用parseDouble -
如果第二个readLine没有撤回任何内容,那么parseDouble会抛出你发现的nullPointerException。
如果你把它改成使用tempS,你仍然不安全,因为在while循环检查无效之后你正在读tempS。
http://docs.oracle.com/javase/7/docs/api/java/lang/Double.html#parseDouble(java.lang.String)
希望有帮助=)
答案 2 :(得分:0)
如果您打算使用词典排序(Read:Collections.sort()),我强烈建议您不要使用链表进行排序。这将从O(nlog(n))到O(n ^ 2 * log(N))进行排序。意味着更多的因素。这是因为LinkedList中任何元素的访问时间都是O(N)。
或者,使用ArrayList或使用像Trie + LL这样的桶式排序。 ArrayList + stand java的东西实现起来要快得多