Kilka pytań o podstawy javy

0

Hej, mam małe pytanka dotyczące Javy, jeśli są głupie to przepraszam, ale się uczę:

Zrobiłam sobie implementację drzewa Trie z tablicami (każdy węzeł ma 52 węzły dzieci, na początku jako nulle) oraz z hashmapą (brak pustych dzieci, tylko cięższe mi się to na razie wydaje):

  1. Czytałam o funkcjach statycznych. Jak dobrze rozumiem, stosuję się je np. dla klas które udostępniają funkcje biblioteczne niezależne od samej klasy - np. jakieś operacje matematyczne.
    Czy jeśli moje drzewo ma wewnętrzną prywatną metodę calculateIndex(char c):

    private int calculateIndex(char c) {
        if (c >= 'A' && c <= 'Z')
            return c - BIG_A_ASCII_CODE + ALPHABET_SIZE/2;    //wyniki 26-51
        else
            return c - SMALL_A_ASCII_CODE;            //wyniki 0-25
    }
    

    to czy powinna ona być statyczna? <ta metoda jest tylko dla implementacji wykorzystującej tablice>

  2. Chciałabym aby moja funkcja informowała, że znak na wejściu jest spoza zakresu 'a' - 'z' lub 'A' - 'Z'. Jak powinno to być zrobione? Jakiś wyjątek ze standardowych z Javy?

    private int calculateIndex(char c) {
        if (c >= 'A' && c <= 'Z')
            return c - BIG_A_ASCII_CODE + ALPHABET_SIZE/2;    //wyniki 26-51
        else if (c >= 'a' && c <= 'z')
            return c - SMALL_A_ASCII_CODE;            //wyniki 0-25
        else
            // co tutaj?
    }
    
  3. Czy jest jakiś "najbardziej polecany" sposób na iterację po literach Stringa w Javie?

    Taki wydaje się słaby :/ :

    for (int i = 0; i < str.length(); i++) {
        if (str.charAt(i) == 'O') {
            //
        }
    }
    
3

Ad 1. Tak jak najbardziej powinna być statyczna.
Ad 2. IllegalArgumentException chyba jak najbardziej pasuje
Ad 3. Dla stałych ciągów: for(char ch: "abcde".toCharArray()) dla pozostałych - tak jak zrobiłaś

Zastanów się nad:
https://docs.oracle.com/javase/7/docs/api/java/lang/Character.html#isAlphabetic(int)
https://docs.oracle.com/javase/7/docs/api/java/lang/Character.html#isLowerCase(char)
https://docs.oracle.com/javase/7/docs/api/java/lang/Character.html#isUpperCase(char)

Oraz nad sprawdzeniem całego napisu na początku:

      boolean ok=!str.chars().anyMatch(ch -> !Character.isLowerCase(ch) && !Character.isUpperCase(ch));

Jeżeli cały napis już sprawdzony to wystarczy:

private static int calculateIndex(char c) { return c-(Character.isLowerCase(ch)?'a':('A'+('z'-'a'+1))); }
2
_13th_Dragon napisał(a):

Ad 2. IllegalArgumentException chyba jak najbardziej pasuje

Można jeszcze Optionala użyć:

private OptionalInt calculateIndex(char c) {
    if (c >= 'A' && c <= 'Z') {
        return OptionalInt.of(c - BIG_A_ASCII_CODE + ALPHABET_SIZE/2);    //wyniki 26-51
    }
    if (c >= 'a' && c <= 'z') {
        return OptionalInt.of(c - SMALL_A_ASCII_CODE);            //wyniki 0-25
    }
    OptionalInt.empty();
}

eh, java i jej brzydkie nieobsługiwanie prymitywów w generykach :(
BTW jak robisz ifa to dodawaj zawsze nawyasy {}. W przyszłości może ci to wiele godzin debugowania zaoszczędzić :D

Ad 3. Dla stałych ciągów: for(char ch: "abcde".toCharArray()) dla pozostałych - tak jak zrobiłaś

Może jeszcze na stream pewnie zamienić i foreacha zrobić, ale to pewnie dla zaawansowanych :P

1
Kamila2004 napisał(a):

Zrobiłam sobie implementację drzewa Trie z tablicami (każdy węzeł ma 52 węzły dzieci, na początku jako nulle) oraz z hashmapą (brak pustych dzieci, tylko cięższe mi się to na razie wydaje):

Jednak obstawiałbym hashmapę, wtedy wystarczy cały napis przekształcić na lowercase:
i mapę dać jako: hashmap<Char,Trie>

1
Kamila2004 napisał(a):

Hej, mam małe pytanka dotyczące Javy, jeśli są głupie to przepraszam, ale się uczę:

Zrobiłam sobie implementację drzewa Trie z tablicami (każdy węzeł ma 52 węzły dzieci, na początku jako nulle) oraz z hashmapą (brak pustych dzieci, tylko cięższe mi się to na razie wydaje):

  1. Czytałam o funkcjach statycznych. Jak dobrze rozumiem, stosuję się je np. dla klas które udostępniają funkcje biblioteczne niezależne od samej klasy - np. jakieś operacje matematyczne.
    Czy jeśli moje drzewo ma wewnętrzną prywatną metodę calculateIndex(char c):

    private int calculateIndex(char c) {
        if (c >= 'A' && c <= 'Z')
            return c - BIG_A_ASCII_CODE + ALPHABET_SIZE/2;    //wyniki 26-51
        else
            return c - SMALL_A_ASCII_CODE;            //wyniki 0-25
    }
    

    to czy powinna ona być statyczna? <ta metoda jest tylko dla implementacji wykorzystującej tablice>

Pod żadnym pozorem nie. Deklaruj wszystkie funkcje jako dynamiczne, a nie static, chyba że masz jakiś bardzo dobry powód żeby zrobić ją static (prawie nigdy nie ma dobrego powodu, poza nielicznymi wyjątkami).

  1. Chciałabym aby moja funkcja informowała, że znak na wejściu jest spoza zakresu 'a' - 'z' lub 'A' - 'Z'. Jak powinno to być zrobione? Jakiś wyjątek ze standardowych z Javy?

    private int calculateIndex(char c) {
        if (c >= 'A' && c <= 'Z')
            return c - BIG_A_ASCII_CODE + ALPHABET_SIZE/2;    //wyniki 26-51
        else if (c >= 'a' && c <= 'z')
            return c - SMALL_A_ASCII_CODE;            //wyniki 0-25
        else
            // co tutaj?
    }
    

Rzuć wyjątek.

  1. Czy jest jakiś "najbardziej polecany" sposób na iterację po literach Stringa w Javie?

    Taki wydaje się słaby :/ :

    for (int i = 0; i < str.length(); i++) {
        if (str.charAt(i) == 'O') {
            //
        }
    }
    

A ma to jakiekolwiek znaczenie? Wszystko jedno jaki sposób wybierzesz, nie ma powodu wybierać "najlepszego", w najlepszym wypadku będzie to mikrooptymalizacja.

4

ad. 1. może być statyczna, ale nie musi. Czy powinna? IMO w tym przypadku nie powinna - nie ma potrzeby robić metody prywatnej statyczną.
ad 2. Zależy. Generalnie zależy od tego jak bardzo wyjątek jest wyjątkowy - jeśli dane trafiają od użytkownika (input/plik) i błędny zakres może się zdarzyć często to raczej nie warto stosować wyjątków - tylko siakiś Either lub Result. Wyjątek (runtimeException - np. IllegalArgumentException) można rzucić jeśli dane te pochodzą z konfiga, kodu lub innego zaufanego źródła, które w normalnych warunkach nie powinno być błędne.
ad 3. Cokolwiek działa, choć tak na przyszłość warto wiedzieć, że Stringi to trudny temat i mamy takie rzeczy jak Characters, Code points, Glyphs,itd. Ale w normalnych przypadku iteracja po znakach (Characters) to zwykle dobra odpowiedź:
https://www.baeldung.com/java-string-to-stream

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