Java编程 有1亿个浮点数,请找出其中对大的10000个
有1亿个浮点数,请找出其中对大的10000个。提示:假设每个浮点数占4个字节,1亿个浮点数就要站到相当大的空间,因此不能一次将全部读入内存进行排序。
/**
*
*/
package com.code;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import junit.framework.Assert;
import org.junit.Test;
/**
* @author Chi
*
*/
public class FloatSelector {
// @Test
public void testGenerateData(){
this.generate(100000000);
}
@Test
public void select(){
long start = System.currentTimeMillis();
final int SIZE = 10000;
Float[] selected = new Float[SIZE];
BufferedInputStream in = new BufferedInputStream(this.getClass().getResourceAsStream("data"));
//Set buffer to load array for one time.
final int BUFFER_SIZE = SIZE * 4;
final byte[] buffer = new byte[BUFFER_SIZE];
//1, Fill selected array
int pointer = 0;
int read = 0;
try {
read = in.read(buffer);
for(int i = 0; i < read / 4; i++ ){
selected[pointer ++] = Float.intBitsToFloat(bytes2int(buffer, i*4));
}
//2, sort the array
Arrays.sort(selected, Collections.reverseOrder());
while((read = in.read(buffer)) > 0){
for(int i = 0; i < read / 4; i++ ){
float newValue = Float.intBitsToFloat(bytes2int(buffer, i*4));
int j;
for(j = selected.length - 1; j >= 0 && newValue > selected[j]; j--);
if(j < selected.length - 1){
//move
for(int k = selected.length - 1; k > j + 1; k --){
selected[k] = selected[k - 1];
}
相关文档:
网上有了很多这样的文章,不过感觉并不是很全,我都东找西找才最终把JAVA调用c++给搞定。
下面引用了很多网上已经有的的内容,我在这里只是整合一次,让以后的朋友少走网路。
多说无益,具体如下:
作者:mykoma
假设所有文件都放在d:\
Step 1:
写JAVA文件
例如程序testdll.java,内容为:
......
1、 认识Thread和Runnable
Java中实现多线程有两种途径:继承Thread类或者实现Runnable接口。Runnable是接口,建议用接口的方式生成线程,因为接口可以实现多继承,况且Runnable只有一个run方法,很适合继承。在使用Thread的时候只需继承Thread,并且new一个实例出来,调用start()方法即可以启动一个线程。
Thread Test = ......
守护线程(Daemon)
Java有两种Thread:“守护线程Daemon”与“用户线程User”。
我们之前看到的例子都是用户,守护线程是一种“在后台提供通用性支持”的线程,它并不属于程序本体。
从字面上我们很容易将守护线程理解成是由虚拟机(virtual machine)在内部创建的,而用户线程则是自 ......
以前为了过滤Java的ISO-8859-1字符,总是使用如下代码来处理。
view plaincopy to clipboardprint?
String strUserame = (String)reuqest.getParameter("username");
strUsername = new String(strUserame.getBytes("ISO-8859-1"),"UTF-8");
String strUserame ......
1.
扎实的基础。数据结构、离散数学、编译原理,这些是所有计算机科学的基础,如果不掌握他们,很难写出高水平的程序。据我的观察,学计算机专业的人比学其他
专业的人更能写出高质量的软件。程序人人都会写,但当你发现写到一定程度很难再提高的时候,就应该想想是不是要回过头来 ......