Я выполняю следующее упражнение по программированию: Метки времени URL . Утверждение таково:
Для моего веб-приложения мне нужен класс, который позволяет хранить временные метки для URL-адресов. Для URL, к которым никогда не обращались, он должен возвращать -1. Класс должен уметь обрабатывать около миллиона вызовов за несколько секунд.
Я пытался:
import java.net.URL;
import java.util.*;
public class UrlMap {
private static final Map<URL,Long> map = new HashMap<URL,Long>();
public void setTimestamp(URL url, long timestamp) {
map.put(url,timestamp);
}
public long getTimestamp(URL url) {
System.out.println("map: "+map);
return map.getOrDefault(url,-1L);
}
}
У меня много любопытства, потому что он не проходит тесты выполнения, но он проходит тесты примера. Примеры тестов:
import static org.junit.Assert.*;
import org.junit.Test;
import java.net.URL;
public class UrlMapTest {
@Test
public void testCodewars() throws Exception {
UrlMap map = new UrlMap();
URL url1 = new URL("http://www.codewars.com/");
long time1 = 12345L;
URL url2 = new URL("http://www.codewars.com/kata/url-timestamps/");
long time2 = 67890L;
map.setTimestamp(url1, time1);
map.setTimestamp(url2, time2);
assertEquals(time1, map.getTimestamp(url1));
assertEquals(time2, map.getTimestamp(url2));
}
@Test
public void testNew() throws Exception {
UrlMap map = new UrlMap();
URL url1 = new URL("http://www.codewars.com/");
URL url2 = new URL("http://www.codewars.com/kata/url-timestamps/");
assertEquals(-1, map.getTimestamp(url1));
assertEquals(-1, map.getTimestamp(url2));
}
}
Я объясню сложность как можно лучше. Выполнение тестов создает «url1» с отметкой времени 12345L. Затем в следующих тестах он создает url1 без отметки времени. Таким образом, он ожидал получить -1, поскольку не должен сохранять временную метку, однако у него есть начальная временная метка, так как карта имеет статус c.
Поскольку изображение стоит больше, чем тысяча слов:
Я думаю, что этот код проходит примеры тестов, потому что в каждом из методов тестирования создается новый UrlMap. Тем не менее, в тестах выполнения я предполагаю, что тот же самый класс urlMap используется повторно.
Чтобы попытаться исправить эту проблему, я прочитал: Как я могу инициализировать stati c Map? Как обновить значение, учитывая ключ в хэш-карте? Как эффективный способ реализовать шаблон синглтона в Java?
Как мы можем хранить URL-адреса и временные метки с одноэлементным шаблоном?
РЕДАКТИРОВАТЬ: После ответа @JoakimDanielson мы проходим тест, который ранее обсуждался. Однако время ожидания превышает 16000 мс. Как мы могли бы улучшить этот код, чтобы передать его?
import java.net.URL;
import java.util.*;
public class UrlMap {
private Map<URL,Long> map;
public UrlMap(){
map=new HashMap<URL,Long>();
}
public void setTimestamp(URL url, long timestamp) {
map.put(url,timestamp);
}
public long getTimestamp(URL url) {
return map.getOrDefault(url,-1L);
}
}