const [queue, setQueue] = React.useState<string[]>([]);
React.useEffect( () => {
// 전달 받은 시세 데이터의 종목코드를 push
setQueue(prev => {
let newArr = [...prev]
newArr.push('종목코드')
return newArr
})
// 일정 시간 뒤에 shift
setTimeout( () => {
setQueue( prev => {
let newArr = [...prev]
newArr.shift()
return newArr
})
},5000)
},['전달받은 rabbitMq의 시세 데이터'])
class Queue<T> {
items: T[] = [];
enqueue(item: T) {
this.items.push(item);
}
dequeue(): T | undefined {
if (this.isEmpty()) {
return undefined;
}
return this.items.shift();
}
isEmpty(): boolean {
return this.items.length === 0;
}
size(): number {
return this.items.length;
}
}
const initialQueue = new Queue<string>();
const [queue, setQueue] = React.useState([initialQueue]);
React.useEffect( () => {
setQueue((prevQueue) => {
const newQueue = new Queue<string>();
newQueue.items = [...prevQueue.items];
newQueue.enqueue('종목코드');
return newQueue;
});
setTimeout(() => {
setQueue((prevQueue) => {
const newQueue = new Queue<string>();
newQueue.items = [...prevQueue.items];
newQueue.dequeue();
return newQueue;
});
}, 5000);
},['전달받은 rabbitMq의 시세 데이터'])
- 여러 데이터가 짧은 시간 내에 여러건 들어오더라도 border가 갑자기 사라지지 않고 일정 시간 동안 유지된다.
- 하지만 array의 shift는 배열의 맨 앞의 값을 삭제하고 재배치 하게 되므로 시간복잡도가 O(n)이 되기 때문에, 해결해야 하는 시세 데이터가 늘어난다면 느려질 수 있다고 생각하게 됨
class Queue<T> {
storage = {};
front = 0;
rear = 0;
size() {
if (this.storage[this.rear] === undefined) {
return 0;
} else {
return this.rear - this.rear + 1;
}
}
add(value) {
if (this.size() === 0) {
this.storage['0'] = value;
} else {
this.rear += 1;
this.storage[this.rear] = value;
}
}
popleft() {
let temp;
if (this.front === this.rear) {
temp = this.storage[this.front];
delete this.storage[this.front];
this.front = 0;
this.rear = 0;
} else {
temp = this.storage[this.front];
delete this.storage[this.front];
this.front += 1;
}
return temp;
}
}
const initialQueue = new Queue<string>();
const [queue, setQueue] = React.useState(initialQueue);
React.useEffect( () => {
setQueue(prev => {
const newQue = new Queue<string>();
newQue.front = prev.front
newQue.rear = prev.rear
newQue.storage = {...prev.storage};
newQue.add('종목코드')
return newQue;
});
setTimeout( () => {
// queue.popleft()
setQueue(prev => {
const newQue = new Queue<string>();
newQue.front = prev.front
newQue.rear = prev.rear
newQue.storage = {...prev.storage};
newQue.popleft();
return newQue
})
}, 5000)
},['전달받은 rabbitMq의 시세 데이터'])
- queue의 storage에 종목코드를 추가/삭제 하는 방식
- 빠른 접근을 위해 front와 rear 값을 설정하고 해당 값을 storage의 key값으로 사용
참고 velog [자료구조] JS로 구현하는 큐 (Queue)