从文件中读取N多数字,找到最大的5个数字

来源:互联网 发布:淘宝二次审核 编辑:程序博客网 时间:2024/06/05 19:51
package cpm.it.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;
/**
 * 需求:
 * <p>读取一个文件,一次读取一个数字,有N多个数字,数组放不下;要求找到5个最大的数字,所以不能想着把所有数字读取出来再放入数组中做比较,
 * 只能一个一个拿出来做比较;</p>
 * 我的思路:
 * <p>先拿出前5个数字,并放入长度为5的数组,然后排序,让最小的数字和以后从文件中读取出来的数字做比较,
 * 只要大于数组中最小的,就把读取出来的数字替换到数组里,这样及可以得到最终的最大的5个数字</p>
 *
 * <p>模拟输出输入的数字:</p>
 * @author King
 *
 */
public class Test1 {

    public static void main(String[] args) {

        readWord("F:/3.txt");
    }

    /**
     * 获取输出流
     *
     * @param namepath
     * @return
     */
    public static OutputStream getOutStream(String namepath) {
        try {
            return new FileOutputStream(new File(namepath));
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 写入
     *
     * @param namepath
     * @return
     */
    public static void writeWord(String namepath) {
        OutputStream out = getOutStream(namepath);
        try {

            java.util.Random r = new java.util.Random();//此处没有用随机数

           //写入文件,模拟N多数字的环境

            for (int i = 1; i < 15; i++) {
                //System.out.println("radom=" + r.nextInt(10));
                System.out.println("i=" + i);
                out.write(i);
            }

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    /**
     * 获取输入流
     *
     * @param namepath
     * @return
     */
    public static InputStream getInStream(String namepath) {
        try {
            return new FileInputStream(new File(namepath));
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 读取
     *
     * @param namepath
     * @return
     */
    public static void readWord(String namepath) {

        int[] s1 = new int[5] ;//用于存放5个数字的数组

        writeWord(namepath);//模拟环境,写入N多数字
        InputStream in = getInStream(namepath);//读取数字
        try {
            /**
             * 要从这个文件读取很多数字,不知道多少,所以不能存入数组 最后要找到最大的5个
             */
            int b = 0;//用于接收读取出来的数字

            int i = 0;//用于循环自增;   在此我们暂时不考虑long型数据

            while ((b = in.read()) != -1) {

                //把前5个数字存入数组中
                if (i < 5) {

                    s1[i] = b;
                }
                //用后面的数字和前面的5个做比较
                if (i >= 5) {
                    
                    Arrays.sort(s1) ;    //做比较之前先进行升序操作
                    
                    if (b > s1[0]) {         //和数组中最小的数字作比较
                        s1[0] = b;             //最关键的一步:大于数组中最小的及把他替换掉
                    }
                }
                i++;
            }


        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        for (int i = 0; i < s1.length; i++) {
            System.out.println("s1["+i+"]="+s1[i]);
        }
    }

}


1 0