Zamiana wielu elementów

Odpowiedz Nowy wątek
2018-11-05 16:30
0

Witam, buduje swój projekt w Javie z użyciem biblioteki Apache POI. Będę bowiem budował pewien dokument Word na podstawie pewnego szablonu.

Mam szablon, w którym mam ok 100 wartości do podmiany. Zasadniczo ładuję plik ze strumieni i mam listę tych obiektów z wartościami jako szablon np. CURRENT_DATE, EMPLOYEE_NAME, EMPLOYEE_SURNAME itd który chciałbym podmieniać na realne dane i podstawie tego szablonu tworzyć wiele plików dla różnych osób. Nie chcę tracić styli dlatego po prostu najlepiej pozamieniać dane.

No i mam teraz coś takiego - ale to jest słabe, bo w jednej pętli wykona się np 100 ifów tylko po to aby zastąpić jedną wartość.


        for (XWPFParagraph paragraph : document.getParagraphs()) {
            XWPFRun run = extractRun(paragraph);
            if (run.getText().isEmpty() == null) {
                continue;
                // pomijam puste paragrafy
            }
            String text = run.getText(0);

            if (text.equals("CURRENT_DATE")) {
                text = text.replace(LocalDateTime.now().format(dateFormatter));
                run.setText(text);
            }

            if (text.equals("DOCUMENT_ID")) {
                text = text.replace("DOCUMENT_ID", "ID12345");
                run.setText(text);
            }

            if (text.equals("EMPLOYEE_NAME")){
                text =                 text.replace("EMPLOYEE_NAME", "Jan Kowalski");
                run.setText(text);
            }
            // i tak dalej kilkanaście wartości
        }

Drugie rozwiązanie też słabe, bo pętla w pętli:


for (int i = 0; i < document.getParagraphs().size(); i++) {

            String current = "CURRENT DATE";

            for (XWPFParagraph paragraph : document.getParagraphs()) {
                XWPFRun run = extractRun(paragraph);
                if (run.getText().isEmpty()) {
                    continue;
                    // pomijam puste paragrafy
                }
                String text = run.getText(0);

                if (text.equals(current)) {
                    text = text.replace(current, "JAKAS WARTOSC");
                    run.setText(text);
                }

            }
        }

Macie jakiś pomysł jak wykonać wiele zamian różnych wartości w bardziej optymalny sposób niż O (n^2) ?

Pozostało 580 znaków

2018-11-05 21:24
0

Zrobiłbym to HashMapem.

        String[] text = {"CURRENT_DATE", "DOCUMENT_ID", "EMPLOYEE_NAME"};

        Map<String, Function<String, String>> operations = new HashMap<>();
        operations.put("DOCUMENT_ID", s -> s.replace(s, "ID12345"));
        operations.put("EMPLOYEE_NAME", s -> s.replace(s, "Jan Kowalski"));

        for (int i = 0; i < text.length; i++) {
            if (operations.containsKey(text[i])) {
                text[i] = operations.get(text[i]).apply(text[i]);
            }
        }

        for (String t : text) {
            System.out.println(t);
        }
edytowany 2x, ostatnio: Potat0x, 2018-11-05 21:34

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0