java 一个数据文件,文件大小超过程序可用运行内存,输出id最小的128 个记录,按照id非降序排列

程序输入:
一个数据文件,文件大小超过程序可用运行内存。
文件内容为单一结构数据的数组:
class Record
{
int id;
byte gender;
short depart;
int age;
};
程序输出:
id最小的128 个记录,按照id非降序排列

注1: 结构体在文件中的存储方式可以自己假定,可以二进制也可以文本
注2:下面列出了几个函数原型供选择,使用其他语言可以自定义函数和结构体

java :
List foo(File file)
C/C++:
int foo(const char *fileName, Record *list) // 返回记录个数,list空间足够大
C#:
List foo(string fileName)

package cn.xmg.thread;

import net.sf.json.JSONObject;
import java.io.*;
import java.util.*;

/**
 * @author 作者 : xmg
 * @version 创建时间:2020年12月23日 下午12:17:25
 *
 *          程序输入: 一个数据文件,文件大小超过程序可用运行内存。 文件内容为单一结构数据的数组: class Record {    int id;
 *          byte gender; 
 *          short depart; 
 *          int age; 
 * }; 
 * 程序输出: id最小的128 个记录,按照id非降序排列
 * 
 * 
 *          内存用的 -Xms10m -Xmx10m
 */
public class MinRecords {

	/** 最大数目 */
	private static final int MAX_NUM = 128;

	/**
	 * 生成测试数据
	 * 
	 * @throws IOException
	 */
	static void createData(File file) throws IOException {
		if (!file.exists()) {
			file.getParentFile().mkdir();
			file.createNewFile();
		}
		FileWriter os = new FileWriter(file, true);
		BufferedWriter oos = new BufferedWriter(os);
		int i = 0;
		while (i < 1000000) {
			Random rand = new Random();
			Record r1 = new Record(rand.nextInt(1000000), (byte) 1, (short) 1, rand.nextInt(1000));
			oos.write(r1.toJson() + "\n");
			i++;
		}
		oos.close();
	}

	/**
	 * json字符串转为Record
	 * 
	 * @param str
	 * @return
	 */
	public static Record toObject(String str) {
		JSONObject fromObject = JSONObject.fromObject(str);
		Record record = new Record();
		record.setId((int) (fromObject.get("id")));
		record.setAge((int) (fromObject.get("age")));
		record.setGender(Byte.valueOf(fromObject.get("gender").toString()));
		record.setDepart(Short.valueOf(fromObject.get("depart").toString()));
		return record;
	}

	/**
	 * 获得按照id非降序排列的记录
	 * 
	 * @param file
	 * @return
	 * @throws IOException
	 */
	public static List<Record> foo(File file) throws IOException {
		BufferedReader reader = new BufferedReader(new FileReader(file));
		String str = null;
		// 使用优先队列创建最大堆
		PriorityQueue<Record> queue = new PriorityQueue<Record>(MAX_NUM);
		while ((str = reader.readLine()) != null) {
			Record record = toObject(str);
			if (queue.size() < MAX_NUM) {
				queue.offer(record);
			} else if (queue.peek().getId() > record.getId()) {
				queue.poll();
				queue.offer(record);
			}
		}
		List<Record> records = new ArrayList<>();
		for (int i = 0; i < MAX_NUM; i++) {
			records.add(queue.poll());
		}
		return records;
	}

	public static void main(String[] args) {
		try {
			File file = new File("D:/test.txt");
			List<Record> records = foo(file);
			for (Record r : records) {
				System.out.println(r.getId());
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	static class Record implements Comparable<Record> {
		int id;
		byte gender;
		short depart;
		int age;

		Record() {

		}

		Record(int id, byte gender, short depart, int age) {
			this.id = id;
			this.gender = gender;
			this.depart = depart;
			this.age = age;
		}

		public int getId() {
			return id;
		}

		public void setId(int id) {
			this.id = id;
		}

		public byte getGender() {
			return gender;
		}

		public void setGender(byte gender) {
			this.gender = gender;
		}

		public short getDepart() {
			return depart;
		}

		public void setDepart(short depart) {
			this.depart = depart;
		}

		public int getAge() {
			return age;
		}

		public void setAge(int age) {
			this.age = age;
		}

		public String toJson() {
			JSONObject obj = new JSONObject();
			obj.put("id", id);
			obj.put("gender", gender);
			obj.put("depart", depart);
			obj.put("age", age);
			return obj.toString();
		}

		@Override
		public int compareTo(Record o) {
			return this.id - o.getId();
		}
	}
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值