Как извлечь конкретный номер из ArrayList? - PullRequest
0 голосов
/ 13 декабря 2018

Я написал программу, которая будет извлекать текстовые данные из http://worldtimeapi.org/api/ip.txt, и извлекать X, где X - это значение рядом с "unixtime".Это то, что я получил до сих пор.

public class GetDataService implements DataService{
  @Override
  public ArrayList<String> getData()  {
    ArrayList<String> lines = new ArrayList<>();
    try {
    URL url = new URL("http://worldtimeapi.org/api/ip.txt");
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(url.openStream()));
    String line;
    while ((line = bufferedReader.readLine()) != null) {
      String a = line;
      lines.add(a);
      }
      bufferedReader.close();

    } catch (IOException ex) {
      throw new RuntimeException("Can not making the request to the URL.");
    }
    return lines;
  }

public interface DataService {
  ArrayList<String> getData() throws IOException;
}

public class UnixTimeExtractor {
  private GetDataService getDataService;

  public String unixTimeExtractor()  {
    ArrayList<String> lines = getDataService.getData();
//how to extract the value next to "unixtime"

Я не знаю, как извлечь значение рядом с "unixtime".И как я могу проверить ошибку NetWork для класса GetDataService.

Ответы [ 3 ]

0 голосов
/ 13 декабря 2018

Я не знаю, как извлечь значение рядом с "unixtime".

Чтобы извлечь значения из списка, вы можете перебирать список, проверять каждое значениепри необходимости и вернуть значение, когда вы нашли совпадение, например:

for (String line : lines) {
  if (line.startsWith("unixtime: ")) {
    return line;
  }
}

Чтобы извлечь значение, которое следует после «unixtime:» в строке, вы можете использовать несколько стратегий:

  • line.substring("unixtime: ".length())
  • line.replaceAll("^unixtime: ", "")
  • line.split(": ")[1]
  • ...

Кстати вам действительно нужносписок строк?Если нет, то вы можете сэкономить память и сократить обработку ввода, если вы выполняете эту проверку при чтении потока ввода с URL-адреса и прекращаете чтение сразу же после того, как вы нашли именно то, что вам нужно.

И как можноЯ тестирую ошибку NetWork для класса GetDataService.

Чтобы проверить, правильно ли обрабатываются сетевые ошибки, вам нужно сделать части кода, которые могут генерировать сетевые ошибки, инъекционными.Затем в ваших тестовых примерах вы можете ввести код замены, который будет генерировать исключение, и убедиться, что программа правильно обрабатывает исключения.

Один из методов - «извлечь и расширить».То есть, извлеките вызов url.openStream() для выделенного метода:

InputStream getInputStream(URL url) throws IOException {
  return url.openStream();
}

и замените в своем коде url.openStream() на вызов getInputStream(url).Затем в своем тестовом методе вы можете переопределить этот метод, выдав исключение, и проверить, что происходит.Используя плавные утверждения с AssertJ:

  @Test
  public void test_unixtime() {
    UnixTimeExtractor extractor = new UnixTimeExtractor() {
      @Override
      InputStream getInputStream(URL url) throws IOException {
        throw new IOException();
      }
    };
    assertThatThrownBy(extractor::unixtime)
      .isInstanceOf(RuntimeException.class)
      .hasMessage("Error while reading from stream");
  }

Вы можете сделать то же самое для чтения из входного потока.

0 голосов
/ 13 декабря 2018

Вы можете использовать Java-8 для достижения того же.Измените свой метод на следующий:

public String unixTimeExtractor() {
   ArrayList<String> lines = getDataService.getData();
   return lines.stream().filter(s -> s.contains("unixtime"))
               .map(s -> s.substring("unixtime: ".length()))
               .findFirst()
               .orElse("Not found");
}

Здесь мы переходим по списку lines, чтобы проверить, найдена ли String unixtime.Если он найден, мы возвращаем его значение, используя подстроку, иначе мы возвращаем Not found.

Для теста вы можете обратиться к ответу janos.

0 голосов
/ 13 декабря 2018

Вы можете перебрать ArrayList с помощью indexOf и получить следующее значение

public String unixTimeExtractor() {
    List<String> lines = getDataService.getData();

    int i = lines.indexOf(unixTime);

    if (i != -1 && ++i < lines.size()) {
        return lines.get(i);
    }
    return null;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...