Как повысить производительность кода java? - PullRequest
2 голосов
/ 16 апреля 2020

Я хочу спросить, как повысить производительность кода? Мне нужно взять весь код html и сохранить его в Queue-LinkedList. Но в процессе извлечения я использую l oop внутри l oop O (n ^ 2). Что слишком медленно. Как улучшить этот код?

publi c Класс парсинга Html {

private static Queue<Character> queueCharacter = new LinkedList<>();

public static void downloadHtmlCode(String addressUrl) throws IOException {

    InputStream is = null;
    try (BufferedReader bufferedReader =
                 new BufferedReader(new InputStreamReader(is = (new URL(addressUrl)).openStream()))) {
        bufferedReader.lines()
                .filter(str -> !str.isEmpty())
                .forEach(str -> {
                    for (char ch : str.toCharArray())
                        if (ch != ' ') queueCharacter.add(ch);
                });
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    is.close();
   }
}

Ответы [ 3 ]

2 голосов
/ 16 апреля 2020

Вы можете использовать flatmap, как показано ниже,

bufferedReader.lines()
            .filter(str -> !str.isEmpty())
            .flatMap(str->str.chars().mapToObj(x -> (char) x))
            .filter(ch->ch != ' ')
            .collect(Collectors.toCollection(LinkedList::new));
0 голосов
/ 16 апреля 2020

Сложность здесь не O(n^2). В вашем коде вы читаете каждый символ дважды, а не n^2 раза. Первое чтение - это когда вы читаете строку, второе - когда вы перебираете символы в этой строке. Это означает, что сложность О(n). Вы можете сделать то же самое в одном чтении: просто прочитайте html символьно и вставьте эти символы в Queue во время чтения.

private static Queue<Character> queueCharacter = new LinkedList<>();

public static void main(String[] args) {

    try (InputStream inputStream = new URL(addressUrl).openStream()) {
        BufferedReader buffer = new BufferedReader(new InputStreamReader(inputStream));
        int c = 0;
        while ((c = buffer.read()) != -1) {
            char character = (char) c;
            if (character != ' ' && character != '\n') {
                //filter space and endline symbol
                queueCharacter.add(character);
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}
0 голосов
/ 16 апреля 2020

Ваш foreach делает карту и собирает операции.

Заменить преобразование строк в массив символов с помощью функции map и queue.add функцией завершения сбора.

->

lines().flatmap(String::chars).mapToObj(c -> (char) c).filter(c -> c != ' ').collect(Collections.toCollection(LinkedList::new));

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