import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.junit.Test;
/** 随即获取N个数据,并把这些数据拍到数据最前面(假设所有数据都不为空) */
public class RandomRank {
public static final int k = 56666;
public static final int num = 56665;
@Test
public void test1() {
String[] bookIDs = new String[k];
for (int i = 0; i < k; i++) {
bookIDs[i] = "" + (i + 1000);
}
long curr1 = System.currentTimeMillis();
randomRank(bookIDs, num);
System.out
.println("最新的方法执行时间 :" + (System.currentTimeMillis() - curr1));
}
@Test
public void test2() {
String[] bookIDs = new String[k];
for (int i = 0; i < k; i++) {
bookIDs[i] = "" + (i + 1000);
}
long curr2 = System.currentTimeMillis();
randomRank1(bookIDs, num);
System.out
.println("先前的方法执行时间 :" + (System.currentTimeMillis() - curr2));
}
@Test
public void test3() {
String[] bookIDs = new String[k];
for (int i = 0; i < k; i++) {
bookIDs[i] = "" + (i + 1000);
}
long curr2 = System.currentTimeMillis();
randomRank2(bookIDs, num);
System.out
.println("第三个方法执行时间 :" + (System.currentTimeMillis() - curr2));
}
@Test
public void test4() {
String[] bookIDs = new String[k];
for (int i = 0; i < k; i++) {
bookIDs[i] = "" + (i + 1000);
}
long curr2 = System.currentTimeMillis();
randomRank3(bookIDs, num);
System.out
.println("先前的方法执行时间 :" + (System.currentTimeMillis() - curr2));
}
/** 第一个方法 */
public static String[] randomRank(String[] bookIDs, int num) {
if (null == bookIDs || 0 == bookIDs.length) {
return null;
}
// 如果轮转个数大于数组长度,则设置为数组长度
if (num >= bookIDs.length) {
num = bookIDs.length;
}
List<String> list = new ArrayList<String>(Arrays.asList(bookIDs));
List<String> reList = new ArrayList<String>(bookIDs.length);
int index;
java.util.Random r = new java.util.Random();
for (int i = 0; i < num; i++) {
index = r.nextInt(list.size());
String s = list.remove(index);
reList.add(s);
}
// 把其他元素保存到新数组中
reList.addAll(list);
String[] ids = new String[reList.size()];
return (String[]) reList.toArray(ids);
}
/** 第二个方法 */
public static String[] randomRank1(String[] bookIDs, int num) {
if (null == bookIDs || 0 == bookIDs.length) {
return null;
}
// 如果轮转个数大于数组长度,则设置为1
if (num >= bookIDs.length) {
num = 1;
}
List<String> list = new ArrayList<String>(bookIDs.length);
for (int i = 0; i < bookIDs.length; i++) {
list.add(bookIDs[i]);
}
int[] ran = randon(num, bookIDs.length);// 随即取数组的下标
List<String> reList = new ArrayList<String>(bookIDs.length);
// 取出随机数
for (int i = 0; i < ran.length; i++) // 按照下标获取数据
{
String o = (String) list.get(ran[i]);
reList.add(o);
}
// 在原有数组中删除随机数
for (int i = 0; i < reList.size(); i++) {
list.remove(reList.get(i));
}
// 把其他元素保存到新数组中
reList.addAll(list);
String[] ids = new String[reList.size()];
return (String[]) reList.toArray(ids);
}
public static String[] randomRank2(String[] bookIDs, int num) {
if (null == bookIDs || 0 == bookIDs.length) {
return null;
}
// 如果轮转个数大于数组长度,则设置为数组长度
if (num >= bookIDs.length) {
num = bookIDs.length;
}
List<String> list = new ArrayList<String>(Arrays.asList(bookIDs));
String[] ids = new String[bookIDs.length];
int index;
java.util.Random r = new java.util.Random();
for (int i = 0; i < num; i++) {
index = r.nextInt(list.size());
String s = list.remove(index);// 这方面花费时间会比randomRank3多,牵扯到数组的复制
ids[i] = s;
}
for (int i = 0; i < list.size(); i++) {
ids[num + i] = list.get(i);
}
list = null;
return ids;
}
public static String[] randomRank3(String[] bookIDs, int num) {
if (null == bookIDs || 0 == bookIDs.length) {
return null;
}
if (num >= bookIDs.length) {
num = bookIDs.length;
}
int[] tem = randon(num, bookIDs.length);// 获取所有随即数的数组下标
String[] ids = new String[bookIDs.length];
for (int i = 0; i < num; i++) {
ids[i] = bookIDs[tem[i]];
bookIDs[tem[i]] = null;
}
int k = num;
for (int i = 0; i < bookIDs.length; i++) {
if (bookIDs[i] != null) {
ids[k++] = bookIDs[i];
}
}
return ids;
}
private static int[] randon(int num, int length) {
boolean[] cards = new boolean[length];// 构造一个比对数组,默认都为false
for (int index = 0; index < length; index++) {
cards[index] = false;
}
java.util.Random r = new java.util.Random();
int x;
// 随机返回下标数组
int[] result = new int[num];
for (int index = 0; index < num; index++) {
do {
x = getRandom(length, r);// 当card[x]元素为true时,一直循环,这浪费时间
} while (cards[x]);
cards[x] = true;
result[index] = x;
}
return result;
}
private static int getRandom(int length, java.util.Random r) {
int x;
x = r.nextInt(length);
return x;
}
}
分享到:
相关推荐
S7-200SMART_modbusRTU轮询程序(读轮询+写优先)附使用说明
单片机 程序架构 时间片轮询.
主要介绍了c# 实现轮询算法实例代码的相关资料,这里附有实例代码,具有一定的参考价值,需要的朋友可以参考下
松下plc 轮询 标准 程序 程式,基于松下plc做的485通讯和几台其他设备通信
S7-200SMART PLC进行MODBUS通信轮询卡死时重新开启轮询的具体方法演示
图片轮询查看
init.c轮询注册事件init.c轮询注册事件init.c轮询注册事件init.c轮询注册事件
8通道输入,1通道输出,采取请求应答方式,对8通道输入进行仲裁,采用公平轮询机制;
本文实例为大家分享了Android实现轮询的方式,供大家参考,具体内容如下 1.通过rxjava实现(代码中使用了Lambda表达式) private static final int PERIOD = 10 * 1000; private static final int DELAY = 100; ...
Ajax轮询,Ajax长轮询和websocket.docx
vb6 modbus 进行轮询读取 接收数据长度正确后再轮询 并将接收数据依次写入三个textbox中
本程序采用文件的形式,按照设定轮询时间对数据进行轮询显示
单片机中断方式与轮询方式 单片机中断方式与轮询方式
stm32使用轮询方式来检测串口的接收数据,没有使用中断,适合于初学者
zencart不跳转账号轮询
那么,什么是单片机中断,它与CPU的轮询有什么区别?在本文中,单片机开发工程师将对单片机中断和CPU轮询做个简单的介绍。 中断: 中断是一种硬件机制,在这种机制中,设备会通知CPU它需要引起注意。中断可以...
S7-200SMART通过循环移位实现MODBUS RTU轮询的具体方法示例
基于TIA PORTAL V15.0的MODBUS RTU轮询全局库FB,调用该FB之后,不需要再写大量的轮询程序。
消息推送,轮询,消息通知
轮询采集指令ModbusPLC详细说明,版本V3.2