본문 바로가기

hello 자바!

링크드 리스트로 브라우저 히스토리 구현하기

덱 자료구조를 활용한 경우를 찾아보면 브라우저 히스토리나  멀티 스레드 스케줄링 등이 나옵니다.
익숙하고 자주 사용해 본 브라우저 히스토리 API 의 메서드를 링크드 리스트로 구현해보았습니다.

 

브라우저 히스토리

브라우저 히스토리 API는 브라우저의 세션 히스토리에 접근할 있도록 합니다. 
주요 메서드는 다음과 같습니다.

  • back() : 이전 기록으로 이동
  • forward() : 앞선 기록으로 이동
  • go(int i) : i 만큼 이동, 음수이면 back, 양수이면 forward와 같음

 


 

제약 조건

 브라우저 히스토리를 구현할 때 다음을 조건으로 두었습니다.

  • 히스토리의 총 길이는 5이며,
    이를 넘어갈 경우 가장 오래된 기록을 삭제합니다.

 

  • back, forward, go를 모두 구현합니다.
  • 히스토리의 정해진 길이보다 앞으로 가거나 뒤로 갈 수 없습니다.
  • 다른 기록으로 이동했을 때 새로운 기록을 추가하게 된다면,
    그 기록보다 최신의 기록들을 모두 제거한 후 추가합니다.

 


브라우저 히스토리 구현

로그 클래스

방문한 기록 정보를 나타내는 클래스를 구현합니다.
방문한 곳과 방문 시각을 객체 속성으로 가집니다.

import java.time.LocalDateTime;

public class Log {
	public String path;
	public LocalDateTime visitTime;
	
	public Log(String path) {
		this.path = path;
		visitTime = LocalDateTime.now();
	}
}

 

히스토리 클래스

로그를 요소로하는 링크드 리스트, 현재 인덱스, 최대 사이즈를 객체 속성으로 가지며,
방문 기록을 추가하는 메서드인 visit과 함께 위의 제약조건대로 forward, back, go 메서드를 구현했습니다.

package collection.linkedlist;

import java.util.LinkedList;

import collection.linkedlist.Log;

public class History {
	private LinkedList<Log> logs = new LinkedList<Log>();
	private int cursor = 0;
	final private int MAX_SIZE = 5;
	
	
	public int visit(String website) {
		if (cursor == 0) {
			if (logs.size() == MAX_SIZE) {
				logs.removeLast();
			}
		} else {
			for (int i = 0; i < cursor; i++) {
				logs.removeFirst();
			}
			cursor = 0;
		}
		logs.addFirst(new Log(website));
		return logs.size();
	}
	
	
	public String forward() {
		if (cursor == 0) {
			return null;
		}
		cursor --;
		return logs.get(cursor).path;
	}
	
	
	public String back() {
		if (cursor == logs.size() - 1) {
			return null;
		}
		cursor ++;
		return logs.get(cursor).path;
	}
	
	public String go(int i) {
		if (cursor - i < 0 ) {
			cursor = 0;
		} else if (cursor - i > logs.size() - 1) {
			cursor = logs.size() - 1;
		} else {
			cursor -= i;
		}
		return logs.get(cursor).path;
	}
	
}

 

visit 은 O(1), forward, back, go 메서드는 인덱스에 비례해 시간이 소요됩니다.
방문한 기록만 앞뒤로 순회하는 사용자가 다수가 아니라면, 링크드 리스트로 히스토리를 구현하는 건 괜찮을 것 같습니다. 

전체 코드와 테스트 코드는 여기서 확인할 수 있습니다.

 


Reference

 

 

History API - Web APIs | MDN

The DOM Window object provides access to the browser's session history (not to be confused for WebExtensions history) through the history object. It exposes useful methods and properties that let you navigate back and forth through the user's history, and

developer.mozilla.org

 

 

'hello 자바!' 카테고리의 다른 글

아주 간단한 Spring Boot 배포  (0) 2022.03.19
링크드 리스트  (0) 2021.05.12
어레이 리스트  (0) 2021.05.12
컬렉션 인터페이스  (0) 2021.05.11