Как мы можем хранить URL-адреса и временные метки с одноэлементным шаблоном? - PullRequest
0 голосов
/ 29 февраля 2020

Я выполняю следующее упражнение по программированию: Метки времени 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.

Поскольку изображение стоит больше, чем тысяча слов: enter image description here

Я думаю, что этот код проходит примеры тестов, потому что в каждом из методов тестирования создается новый 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);
  }

}

1 Ответ

1 голос
/ 29 февраля 2020

Просто реализуйте обычный класс, где карта является переменной экземпляра, и ваши тесты пройдут

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);
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...