0

リンク リストを使用してテキスト ファイルからデータを整理し、それを番号順に別の既存のテキスト ファイルに書き直そうとしています。ただし、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;
}
4

3 に答える 3

0

linkedList新しい行ごとに割り当てを削除しています。これは LinkedList ではありません。LinkedList を作成してから、それに新しいノードを追加する必要があります。

linkedList=tempNode;ループから外します。そして、次のようなものtempNodeで最新のものにのみ追加しますnode.nextlastNode.next = tempNode;

于 2013-11-07T18:06:04.670 に答える
0

辞書順ソートを使用する場合は、ソートにリンク リストを使用しないことを強くお勧めします (Collections.sort() を参照)。これにより、O(nlog(n)) から O(n^2 * log(N)) にソートされます。N倍以上という意味です。これは、LinkedList 内のすべての要素のアクセス時間が O(N) であるためです。

または、ArrayList を使用するか、Trie + LL のようなバケット スタイルの並べ替えを使用します。ArrayList + スタンド java のものは、実装がはるかに高速になります

于 2013-11-14T19:04:54.247 に答える
0

while ループ内では、tempS に行を読み込んでいるように見えますが、tempNode を初期化すると、別の行を読み込んでいます (一般化された推測に基づいて、ファイルの終わりから実行できる可能性があります)--

次に、その 2 番目の readLine で parseDouble を呼び出しています --

その 2 番目の readLine が何も引き戻さない場合、parseDouble は nullPointerException をスローします。

tempS を使用するように変更しても、while ループが nullity をチェックした後に tempS を読んでいるため、安全ではありません。

http://docs.oracle.com/javase/7/docs/api/java/lang/Double.html#parseDouble(java.lang.String)

うまくいけば、それは=)

于 2013-11-07T18:13:06.753 に答える