-2

保存したデータを配列からテキスト ファイルに書き出す際に問題が発生しました。ファイル内のある種のデータを取得することができましたが、それが実際に何であるかを理解するのに問題がありました (正しいですか?)。問題は、ファイルが約 4Mb で、開こうとしても、コンピューターがファイルを読み込もうとしているために開かないということです。次に、ターミナルで「cat gedit filename」コマンドを使用します(はい、Linuxを使用しています)。多くのゼロと1が表示されるため、各正方形に数字が印刷された多くの正方形が表示されます。しかし、配列に多数のゼロと 1 が含まれているため、それが配列の内容であるかどうかを確認するのが難しいこともよくわかっています。以下のコードを参照してください。

ただし、ファイル内の他のコードについては、Project Eulerの問題を解決していますが、データを自分で別の目的に使用するので、すべてを配列に格納して別のファイルに保存したいと考えています。問題の解決はうまくいきますが、「ファイルへの書き込み」(メソッド「書き込み」を参照)が機能しないか、機能しますが、ファイルの内容を理解できません。

ファイルには多数の 0 と 1 が含まれている必要があり、さらに多く (配列の最大値は 71)、配列はサイズ 2000x2000 の正方行列です。配列の内容を個別に印刷してデバッグし、これまでのところ機能するかどうかを確認してみました。

    import java.io.BufferedWriter;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.PrintWriter;


    public class Euler27_MATLAB {

        public static boolean isPrime(int n){
            if(n<2 || (n>2 && n%2==0)){
                return false;
            }else if(n==2){
                return true;
            }else{
                for(int i=3; i<=Math.sqrt(n); i=i+2){
                    if(n%i==0){
                        return false;
                    }
                }
                return true;
            }       
        }
                   //THIS IS WHERE I NEED HELP

        public static void write (String filename, int[][]x) throws IOException{
              BufferedWriter outputWriter = null;
              outputWriter = new BufferedWriter(new FileWriter(filename));
              for (int i = 0; i < x.length; i++) {
                for(int j=0; j<x.length; j++){ //array is square
                    outputWriter.write((x[i][j]));
                }
                outputWriter.newLine();
              }
              outputWriter.flush();  
              //outputWriter.close();  
            }
        public static void main(String[] args){
            int tmp=0; int A = 0; int B = 0; int limit = 1000;
            int nbr = 0;
            int [][]array = new int[limit*2+1][limit*2+1];
            long start = System.currentTimeMillis();
            for(int a=-limit; a<=limit; a++){ //2 if only odd nbrs
                for(int b=-limit; b<=limit; b++){   
                    while(isPrime(nbr*nbr+a*nbr+b)){ //n^2+an+b
                        nbr++;
                    }
                     array[a+limit][b+limit]=nbr;

                    if(nbr>tmp){    //store the values for later out-print
                        tmp = nbr; A=a; B=b;
                    }
                    nbr=0;
                }
            }
            long time = System.currentTimeMillis() - start;
            System.out.println("The product a*b is: " + A*B + "\nwith a=" + A +
                    " and b=" + B + " with limit " + limit +".");
             System.out.println("Formula generated " + tmp + " primes.");
            System.out.println("Time: " + time + " ms.");

                //FOR THE ARRAY ----------------------------------------------
            try{
                write("/home/robin/workspace/ProjectEuler/src/pe27",array); 
            }catch(E`enter code here`xception e){
                System.out.println("Failure");
            }
        }
    }

Googleで見つけたコードを試してみましたが、それらも機能しませんでした。

ジル

4

2 に答える 2

-2

ファイル内のデータは正しいです。Java はファイルに保存するときにデータをシリアル化します。これはテキストではなくバイナリ形式です。これにより、後でロードするのが速くなります。人間が判読できるようにするためのものではありません。

人間が読める出力が必要な場合は、XML、YAML、またはその他のテキストベースの形式を検討する必要があります。

于 2013-07-23T17:13:15.663 に答える