2016-04-14 23 views
0

私はJavaには比較的新しいので、何かを絶えず行う方法を調べなければなりません。私は、ヒープソート、マージソートなどのよく知られたソートの分析を含むプロジェクトに取り組んでいます。さまざまな配列をそれぞれ独自の.txtファイルに生成するコードを書きました。ここにコードの一部があります:Javaは複数のファイルから整数配列を読み込みます

import java.io.*; 
import java.util.Arrays; 
import java.util.Collections; 

public class ArrayBuilder { 

public static void main(String[] args) throws IOException { 
    for(int i = 2; i < 7; i++) { 
     int aLength = (int)Math.pow(10, i); 
     buildAscendingArray(aLength); 
     buildDescendingArray(aLength); 
     buildRandomArray(aLength); 
    } 
} 
public static void buildAscendingArray(int arrayLength) throws IOException { 
    File file = new File("arrays_" + arrayLength + "A.txt"); 
    PrintWriter printWriter = new PrintWriter(file); 
    int[] array = new int[arrayLength]; 
    for(int i = 0; i < array.length; i++) { 
     array[i] = i + 1; 
    } 
    printWriter.println(Arrays.toString(array)); 
    printWriter.close(); 
} 

私は多かれ少なかれ同じであるため、部屋を節約しようとすると、ランダムと降順の方法は含まれていませんでした。だから...

私はすでにすべての種類のコード化があります。整数配列を読み込む方法を理解しようとしていますので、別の並べ替えを実行できます。また、System.nanoTime()を追加して、各ソートを実行するのにかかる時間を計るようにしています。そのため、さまざまな入力を比較することができます。これを各ソートのメソッドに追加する必要があるかどうか、またはコールで実装できるかどうかはわかりません。 System.nanoTime(heapsort(array)))?

最終的には、.txtファイルを使用可能な配列にして各ソートを渡すための助けが必要です。私はすべてのテキストファイルを最初の場所に出力し、正確に同じ配列が各ソートを実行するようにします。

私はScannerに多少精通していますが、FileReadやBufferedReader、あるいはその他の方法についても読んでいます。私は、この状況で何が最もうまくいくのか、それを実装する最良の方法を知るには十分な経験はありません。ヘルプは非常に高く評価されます。

+0

なぜ昇順と降順の配列を保存したいですか?とにかくそのロジックが毎回同じ配列を生成するのではないでしょうか? –

+0

本当にテキストファイルが必要なのですか?ファイルストレージが必要な場合は、配列をそのままファイルに書き込んで、ObjectOutputStreamとObjectInputStreamを使用して直接読み取ることができます。 –

+0

これは、最も効率的なやり方であるかどうかにかかわらず、私はすでにテキストファイルを持っていますが、それは無関係です。私は、どのように進めるべきかについての助けを求めています。何かあれば、私の考えでは、プログラム全体のさまざまな側面を分けるという点で役立ちます。 – TheDubiousDubber

答えて

0

アレイをファイルストレージに保存してそれらを元に戻す必要がある場合は、シリアル化を使用できます。

このクラスは、どのように動作するかを知るためのものです。

public class ArrayReaderWriter { 

    public static void main(String[] args) throws Exception { 
     writeArray(20); 
     readArray(20); 
    } 

    public static void writeArray(int arrayLength) throws IOException { 
     File file = new File("arrays_" + arrayLength + "A.ser"); 
     ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(file)); 
     int[] array = new int[arrayLength]; 
     for (int i = 0; i < array.length; i++) { 
      array[i] = i + 1; 
     } 
     os.writeObject(array); 
    } 

    public static void readArray(int arrayLength) throws IOException, ClassNotFoundException { 
     File file = new File("arrays_" + arrayLength + "A.ser"); 
     ObjectInputStream is = new ObjectInputStream(new FileInputStream(file)); 
     int[] array = (int[]) is.readObject(); 
     // Printing here to verify 
     for (int i = 0; i < array.length; i++) { 
      System.out.println(array[i]); 
     } 
    } 

} 

:あなたは別の実行中に同じ配列と異なる種類を実行したい場合、私は、ランダムな配列を保存し理解することができます。しかし、昇順と降順の配列は常に実行ごとに構築できます。

についてSystem.nanoTimeの()

は、詳細な説明は https://docs.oracle.com/javase/8/docs/api/java/lang/System.html#nanoTime--を参照してください。

EDIT

すでにテキストファイルを生成している場合は、@Antoniossssソリューションを使用しています。既存のファイルを読んでいるので、私のコメントで述べたように区切り文字を変更するだけで済みます。

テスト

Scanner scanner = new Scanner("[1, 2, 3]"); 
scanner.useDelimiter("(\\s)*[\\[,\\]](\\s)*"); 
while(scanner.hasNextInt()) { 
    System.out.println(scanner.nextInt()); 
} 

出力

1 
2 
3 
+0

私の考え方は好きですが、私の場合はどのくらいの並べ替えが必要なのか分かりません。現在、私は指示どおりに.txtファイルを生成しています。ソートアルゴリズムは、Eclipseの別のプロジェクトの異なるクラスにあります。私がこのように行った場合、これを実装する方法を知る唯一の方法は、そのコードをすべての種類のクラスと同じクラスに入れて、すべてを一度にすべて完了させることです。デバッグの面で問題を引き起こす可能性があるかどうかは確かではありません。何時間も実行される可能性があるため、コンパイルするとエラーが発生するまでわかりません。 – TheDubiousDubber

+0

あなたの提案にコードを変更してreadArrayメソッドを私のsortAnalysisクラスに渡すのは、実際には難しいことではありませんでした。私は最後にこれで少し楽になると思います。あなたのすべての協力に感謝します! – TheDubiousDubber

0

そのような目的のために、いくつかのdelimeteredファイル形式を使用してスキャナーを使用してそれを読みます。 私たちの区切り文字は;です。、戻ってそれを読んで、次のコードにsimillar方法でScannerを使用するには、この

File file = new File("arrays_" + arrayLength + "A.txt"); 
PrintWriter printWriter = new PrintWriter(new BufferedWriter(new FileWriter(file))); 
printWriter.print(1); 
for(int i = 1; i < array.length; i++) { 
    printWriter.print(';'); // delimeter 
    printWriter.print(i+1); 
} 
printWriter.close(); 

のようなあなたの配列を格納します。

ArrayList<Integer> arr=new ArrayList<>(); 
Scanner scan=new Scanener(new File("yourfile)); 
scan.useDelimeter(';'); 
while(scan.hasNextInt()){ 
    arr.add(scan.nextInt()); 
} 

正常に動作するはずです。区切り文字として改行を使うこともできます。

EDIT:人間が判読できる形式で配列を格納する必要がない場合は、@ Shire Residentと同じようにシリアル化を使用できます。

+0

私は現在、各テキストファイルが[1、2、3、...、n]という形式で書かれているのです。デリミタとして既に使用されているカンマを使用することは可能ですか、それがどのように使用されているか誤解していますか? – TheDubiousDubber

+0

@TheDubiousDubberカンマを使用することはできますが、角かっことスペースで問題が発生します。scanner.useDelimiter( "(\\ s)* [\\\ [、\\ s] *");それは数字だけを残すべきです。 –

関連する問題