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;
}
}
分享到:
相关推荐
如果在一段预定时间内服务器没有新数据,则会响应一个空结果,客户端随即发起一个新的请求。因此,长轮询机制可以降低服务器的负载,减少带宽浪费,同时提高数据更新的即时性。 服务器推送技术(Comet)包含几种...
中断驱动方式下,每当触摸屏检测到新的触控输入,就会触发中断,处理器随即响应,提高实时性;而轮询驱动则是在后台周期性检查触摸状态,适合对实时性要求不那么高的应用。 lib3.12可能是一个特定版本的库文件,...
3. **中断处理**:为提高效率,驱动可设置键盘硬件中断,当按键被按下或释放时,硬件会向CPU发送中断请求,驱动程序随即响应并处理。 4. **DDI(Device Driver Interface)**:在WinCE中,驱动开发者需要实现特定的...
在这个实例中,当有按键按下时,与该按键相连的行线或列线的电平状态会发生变化,触发中断,单片机随即进入中断服务程序,仅扫描有按键动作的行和列,降低了无效扫描的次数。 C语言是编写单片机程序的常用语言,...
当超声波传感器接收到回波时,会触发中断,单片机随即执行中断服务程序,计算距离并更新显示。 六、系统设计与实现 1. 硬件设计:包括MSP430单片机的选择与配置,超声波传感器的连接,以及12864液晶屏的接口电路...
数据链路层可以按照介质访问控制分为信道划分介质访问控制、随即访问介质访问控制和轮询访问介质访问控制等多种类型。 (三)网络层 网络层是计算机网络的第三层,负责路由和转发、拥塞控制和网络地址等功能。网络...
一个单独的timerfd被用来管理整个定时器池,当超过一个时间片的时间时,系统会通过timerfd通知管理线程,管理线程随即处理到期的定时器。 定时器池的工作流程如下: 1. 初始化定时器池,设置时间轮和红黑树。 2. ...
在nRF905的中断收发中,当有数据发送或接收时,nRF905会触发中断,单片机随即处理相应的事务,这样可以提高系统的响应速度并降低功耗。 要实现这个功能,你需要完成以下步骤: 1. **配置nRF905**: 设置nRF905的...
在SNMP中,有两种主要的通信模式:Polling(轮询)和Trap(自陷)。Trap作为一种主动被管理的方式,体现了SNMP协议的智能性和高效性。 ### Trap机制详解 SNMP-Trap是一种由网络设备(如路由器、交换机等)主动向...
- **介质访问控制**:详述了信道划分、随即访问与轮询访问三种介质访问控制方法,包括ALOHA、CSMA/CD等协议。 - **局域网与广域网**:深入讲解了局域网(如以太网、IEEE802.11)与广域网的基本原理与协议。 - **...
- **中断模式**:利用中断机制,ADC1完成一次采样后立即触发中断,处理器随即进入中断服务程序,处理采样数据并更新状态。此模式下,处理器在等待ADC采样时可执行其他任务,提高系统整体效率。然而,中断处理过程中...
RLC层的AM(Acknowledged Mode,确认模式)在数据传输时采用确认重传机制,发送方在发送PDU后会发送轮询帧以等待接收方的ACK。如果等待超时未收到ACK,会重复发送PDU,直至达到最大重发次数仍未收到ACK,RLC实体就会...
中断驱动扫描则是在检测到按键按下时才触发中断,微控制器随即响应中断处理按键事件,这种方式可以减少CPU的无效等待时间,提高效率。 在实际应用中,为了防止按键抖动导致误读,通常会在读取到按键状态后等待一小...