2016-03-26 13 views
0

外部マージソートを実行しようとしています。方法: 'output'フォルダ内のすべてのファイルを開き、1行目を取得してソートし、最終ファイルに書き込んだ後、そのファイルの2行目を取得して繰り返します。私はStackOverflowErrorを取得します。ここで私のファイルサイズはメモリよりも大きい。このエラーが来させることができるものを外部ソートを実行中のStackOverflowError

public class mergefile6 { 
    public static ArrayList<String> al = new ArrayList<String>(); 
    static HashMap hm = new HashMap(); 
    public static String line; 
    public static String[][] filepoint = new String[100][2]; 
    public static int fileline=1; 
    public static int i=0; 

    public static void main(String[] args) throws Exception{ 
     fileread(); 
    } 
    public static void fileread() throws Exception{  
     FileReader fileReader = null; 
     BufferedReader bufferedReader = null;  
    try { 
       File folder = new File("./output/");   
       if (folder.isDirectory()) { 
        for (File file : folder.listFiles()) { 
          fileReader = new FileReader(file); 
          bufferedReader = new BufferedReader(fileReader);   
          int lineCount = 0; 
         while ((line = bufferedReader.readLine())!=null) { 
           lineCount++; 
           if (1 == lineCount) { 
            hm.put(line,file); 
            al.add(line); 
            filepoint[i][0]=file.toString(); 
           filepoint[i][1]=Integer.toString(fileline); 
            ++i; 
           }            
          }    
        } 
       } 
       if (null != fileReader){ 
        try { 
          fileReader.close(); 
        } catch (IOException e) { 
          e.printStackTrace(); 
        } 
     } 
     if (null != bufferedReader){ 
        try { 
          bufferedReader.close(); 
        } catch (IOException e) { 
          e.printStackTrace(); 
        } 
     } 
     Sorting(al); 
     test(al); 
    } catch (Exception e) { 
    } finally { 
    } 
    } 
    public static void Sorting(ArrayList<String> al)throws Exception{ 
    int length = al.size(); 
    ArrayList<String> tmp = new ArrayList<String>(al); 
    mergeSort(al, tmp, 0, al.size() - 1); 
    } 
    private static void mergeSort(ArrayList<String> al, ArrayList<String> tmp, int left, int right){ 
    //sort code 
    } 

public static void test(ArrayList<String> al) throws Exception{ 
    BufferedWriter bw = null; 
    FileWriter fw = null; 
     fw = new FileWriter("final",true); 
     bw = new BufferedWriter(fw); 
     bw.write(al.get(0)+" \n"); 
     //bw.flush(); 
     bw.close(); 
     fw.close(); 
     String filename = hm.get(al.get(0)).toString(); 
     hm.remove(al.get(0)); 
     al.remove(0); 
     fileforward(filename,al); 
} 
public static void fileforward(String filename,ArrayList<String> al) throws Exception{ 
    long list; 
    FileReader fr = null; 
    BufferedReader br = null; 
    fr = new FileReader(filename); 
    br = new BufferedReader(fr); 
    for(int j=0;j<i;++j){ 
     if(filepoint[j][0] == filename){ 
      fileline = Integer.parseInt(filepoint[j][1]); 
      list = br.skip(99*fileline); 
      if((line = br.readLine())!=null){ 
       hm.put(line,filename); 
       al.add(line); 
       ++fileline; 
       filepoint[j][1]=Integer.toString(fileline); 
       br.close(); fr.close(); 
      }else{}    
     } 
    } 
    if(al.size()==3){ 
    Sorting(al); 
    test(al);  }        
} 
} 

+0

私が得るエラーは以下のとおりです。java.util.Hashtable.getのスレッドで 例外java.util.Hashtable.hashで "メイン" によってjava.lang.StackOverflowError \t(Hashtable.java:239) \t(Hashtableの.java:434)java.util.Properties.getProperty(Properties.java:951) java.lang.System.getProperty(System.java:711で\t)sun.security.action.GetPropertyActionで \tで\t。 (GetPropertyAction.java:84) \tリバレッジ(ネイティブメソッド) at java.io.BufferedWriter (BufferedWriter.java:109) at java.io.BufferedWriter。 (BufferedWriter.java:88) –

+0

最初の質問の更新情報としてコメントを記述してください。タグのセクションの直後に、質問の最後に*編集*ボタンを使用して行うことができます。 – aribeiro

+0

あなたのコードは混乱しています。テストではfileforward()を呼び出し、fileforwardではテストを再度呼び出します。このような再帰は通常、スタックのオーバーフローを引き起こします。しかし、私はあなたのコードを理解していないし、私の日食で実行されないため、詳細であなたを助けることができません:test()はあなたのメインプログラムによってキャッチされていないArrayIndexOutBoundExceptionを生成し、 – Heri

答えて

1

fileforward()test()の間の相互呼び出しによってオーバーフローが発生する可能性があります。私は、ログやプリントでArrayListのサイズをデバッグしようとしているのか分かりません。それが常に3に等しい場合、それは問題です。

+0

:はい。それは3と等しいと言いますが、問題は何ですか?申し訳ありませんが、私はこれで新しいと何が原因でエラーが発生しているか分からない。ここでは3つの入力データファイルがあり、ArrayListはそれぞれから1行目を格納し、並べ替え操作を実行し、1行目を出力してArrayListからその行を削除し、その特定のファイルからline2を格納します。したがって、EOFに達するまで3になるはずです。 –

+0

これらは互いに無期限に呼び出すため、サブルーチンコールスタックでオーバーフローが発生します。相互ファンクション再帰は、制御された環境下でのみ使用する必要があります。私はコードを理解することができないので、それを書く方法についてあなたに助言を与えることはできません。関数間の再帰を使わずに解くために、問題を再検討してみてください。 – Hellzzar

関連する問題