前几天我在一次面试中遇到了这个问题,我想知道一些最好的答案(我回答得不是很好,哈哈):
场景:有一个网页正在监控通过某个网络发送的字节。每次发送一个字节时,都会调用recordByte()函数来传递该字节,这种情况每天可能会发生数十万次。此页面上有一个按钮,按下该按钮时,将在屏幕上显示传递给recordByte()的最后100个字节(它通过调用下面的print方法来完成此操作)。
以下代码是我得到并要求填写的代码:
public class networkTraffic {
public void recordByte(Byte b){
}
public String print() {
}
}存储这100个字节的最佳方法是什么?一份清单?好奇如何最好地做到这一点。
发布于 2011-11-03 03:31:53
我不知道java,但是一定有一个队列的概念,你可以把字节排入队列,直到队列中的项数达到100个,这时你可以把一个字节出队,然后再把另一个字节排入队列。
public void recordByte(Byte b)
{
if (queue.ItemCount >= 100)
{
queue.dequeue();
}
queue.enqueue(b);
}您可以通过查看以下项目来打印:
public String print()
{
foreach (Byte b in queue)
{
print("X", b); // some hexadecimal print function
}
} 发布于 2011-11-03 03:30:41
最简单的方法是将其放入数组中。该数组可以容纳的最大大小是100字节。继续添加字节,因为它们是从web上流出的。在前100个字节在数组中之后,当第101个字节到来时,删除头部的字节(即第0个)。继续这样做。这基本上是一个队列。先进先出的概念。下载完成后,剩下最后100个字节。
不仅在下载之后,而且在任何给定的时间点,此数组都将具有最后100个字节。
@Yottagray没有找到问题所在?似乎有许多通用方法(数组、循环数组等)&许多特定于语言的方法(byteArray等)。我是不是遗漏了什么?
发布于 2012-03-09 09:02:28
采用非阻塞I/O的多线程解决方案:
private static final int N = 100;
private volatile byte[] buffer1 = new byte[N];
private volatile byte[] buffer2 = new byte[N];
private volatile int index = -1;
private volatile int tag;
synchronized public void recordByte(byte b) {
index++;
if (index == N * 2) {
//both buffers are full
buffer1 = buffer2;
buffer2 = new byte[N];
index = N;
}
if (index < N) {
buffer1[index] = b;
} else {
buffer2[index - N] = b;
}
}
public void print() {
byte[] localBuffer1, localBuffer2;
int localIndex, localTag;
synchronized (this) {
localBuffer1 = buffer1;
localBuffer2 = buffer2;
localIndex = index;
localTag = tag++;
}
int buffer1Start = localIndex - N >= 0 ? localIndex - N + 1 : 0;
int buffer1End = localIndex < N ? localIndex : N - 1;
printSlice(localBuffer1, buffer1Start, buffer1End, localTag);
if (localIndex >= N) {
printSlice(localBuffer2, 0, localIndex - N, localTag);
}
}
private void printSlice(byte[] buffer, int start, int end, int tag) {
for(int i = start; i <= end; i++) {
System.out.println(tag + ": "+ buffer[i]);
}
}https://stackoverflow.com/questions/7986186
复制相似问题