快速整数整数文件

时间:2014-06-23 01:42:11

标签: java

我必须快速输入整数的用户输入文件(文件中的每一行包含一个整数)。我的快速方法工作,我已经测试过了。我无法读取文件并在同一文件中按排序顺序打印出来。我还需要计算这个过程需要多长时间。这是我到目前为止:传递给该方法的第一个参数是文件的整数数量,传递的第二个参数是文件的名称。 generateRandom()方法来自Question0类,它创建一个随机整数的文件,每个整数用一条线分隔。它需要两个参数:int和filename。它创建一个名为filename的文件,它由int整数组成。希望这一切都有道理。

编辑:这是一个正常工作的代码,但是当文件中有100万个数字时,我无法运行它。它给出了内存错误。当有10亿时,它表示数字格式。我必须运行一个包含10亿个数字的测试文件。

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Scanner;

public class QuickSort1000 {
    public static void main(String[] args) throws Exception
    {
        int n = Integer.parseInt(args[0]);
        String filePath = args[1];
        Question0 genRan = new Question0();
        genRan.generateRandom(n, filePath);
        //rest if for quicksorting
        File inFile = new File(filePath);
        Scanner in = new Scanner(inFile);
        int[] list = new int[n];
        for(int i = 0; i < n; i++)
        {
            list[i] = in.nextInt();
        }
        in.close();

        long startTime = System.nanoTime();
        qSort(list, 0, list.length - 1);
        long endTime = System.nanoTime();
        long duration = endTime - startTime;
        System.out.println("Total time: " + duration + " nanoseconds");
        for(int i = 1; i < list.length; i++)
        {
            if(list[i - 1] > list[i])
            {
                throw new Exception("Not in sorted order");
            }
            //System.out.print(list[i]);
        }

    }

        // TODO Auto-generated constructor stub
    /**
     * The main quicksort method that uses the partition method below
     * @param a the input array
     * @param p the first valid index of array
     * @param r the last valid index of array
     */
        public static void qSort(int[] a, int p, int r) {
            // TODO Auto-generated method stub
            if (p < r)
            {
                int q = Partition(a, p, r);
                qSort(a, p, q - 1);
                qSort(a, q + 1, r);
            }

        }
        /**
         * Partitions the array with respect to the last element in the array
         * @param a the input array
         * @param p the first element in the array
         * @param r the last element in the array
         * @return the element with which we will partition with respect to. The 
         * return element will be in its correct spot.
         */
        private static int Partition(int[] a,int p, int r)
        {
            int x = a[r];
            int i = p - 1;
            int temp = 0;
            for(int j = p; j <= r - 1; j++)
            {
                if(a[j] <= x)
                {
                    i++;
                    temp = a[i];
                    a[i] = a[j];
                    a[j] = temp;
                }
            }
             temp = a[i+1];
             a[i+1] = a[r];
             a[r] = temp;
             return i + 1;
        }


    }

1 个答案:

答案 0 :(得分:1)

基于以下陈述,我推断OP正在询问如何在同一文件上执行IO输入和输出。

  

我无法读取文件并将其打印出来   在同一个文件中订购。

  1. 如果用户确切地告诉您有多少整数,则无需使用hasNext()
  2. 类似地说,如果你已经知道很多整数,就不需要创建一个可变大小List
  3. 在您准备破坏文件之前,不应该打开指向文件的PrintWriter
  4. 以下是原始问题中main的更正版本。

    public static void main(String[] args) throws FileNotFoundException
    {
        int n = Integer.parseInt(args[0]);
        String filePath = args[1];
        //rest is for the quicksorting
        File inFile = new File(filePath);
        Scanner in = new Scanner(inFile);
        int[] list = new int[n];
        for(int i = 0; i < n; i++)
            list[i] = in.nextInt();
        in.close();
        long startTime = System.currentTimeMillis();
        qSort(list, 0, list.length - 1);
        long endTime = System.currentTimeMillis();
        long duration = endTime - startTime;
        System.out.println(duration);
    
    
        // Create a PrintWriter and clobber the file AFTER you have read it.
        PrintWriter out = new PrintWriter(filePath);
        for (int i = 0; i < n; i++) {
            System.out.println(list[i]);
            out.println(list[i]);
        }
        out.close();
    
    }