Nietypowy problem z nauką Java

Nietypowy problem z nauką Java
E1
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 3 lata
  • Postów:27
0

Cześć,
mam troszkę chyba nietypowy problem. Chcę nauczyć się programować w języku Java, ale nie potrafię się przekonać do samego kodu. Uczę się samodzielnie Pythona od dwóch lat i patrząc na różne przykłady gdzieś w sieci mimowolnie zaczynam zastanawiać się jak to napisać w Pythonie. I to jest mój problem. W książce, którą czytam ("Java w 21 dni" Rogers Cadenhead) jest przykładzik który ma coś wydrukować. Przepisując kod z książki do repl.it wywaliło nawet errora, ale że nie lubię się poddawać to wypatrzyłem gdzie jest źle i poprawiłem błąd. Nazwa klasy była inna, która występowała także poniżej w metodzie. Działa. Tyle tylko, że tak naprawdę nie potrafię zrozumieć tego kodu. Wygląda on tak:

Kopiuj
class Main {
  int[] makeRange(int lower, int upper) {
    int[] range = new int[(upper-lower) + 1];

    for (int i = 0; i < range.length; i++) {
      range[i] = lower++;
    }
    return range;
  }
  public static void main(String[] arguments) {
    int[] range;
    Main lister = new Main();
    range = lister.makeRange(4,13);
    System.out.print("Tablica: [ ");
    for (int i = 0; i < range.length; i++) {
      System.out.print(range[i] + " ");
    }
    System.out.println("]");
  }
}

Natomiast dokładnie to samo w Pythonie zajmuje znacznie mniej:

Kopiuj
class RangeNums():
  def __init__(self, nums):
    self.nums = nums

  nums = [x for x in range(4,14)]
  str_nums = " ".join([str(x) for x in nums])
  print("Tablica: [ " + str_nums + " ]")

Wiem, głupia sprawa, ale czy jest jakiś sposób, żeby się przekonać do zapisu Javy i samego języka? Chciałbym się nauczyć nie myśleć Pythonem .. jakby to nie zabrzmiało ;)


Komplikowanie jest proste, upraszczanie jest skomplikowane.
Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:24 minuty
1

Najpierw zapodaj sobie bibliotekę z rozsądnymi kolekcjami :)

Z http://www.vavr.io/ przykład wygląda tak:

Kopiuj
import io.vavr.collection.Iterator;
import static java.lang.System.out;

public class MkStringVavr {
    public static void main(String[] args) {
        Iterator<Integer> nums = Iterator.range(4, 14);
        String strNums = nums.mkString(" ");
        out.println("Tablica: [" + strNums + "]");
    }
}

i to bez słówka kluczowego var, które weszło w Javie 10. Z nim byłoby jeszcze krócej.

Vavr.io jednak nie jest kompatybilne wprost z kolekcjami Javowymi (potrzeba konwersji między nimi), więc jeśli chcesz zachować pełną kompatybilność ze standardowymi kolekcjami Javowymi to zostają biblioteki typu Google Guava. Wtedy kod wygląda tak:

Kopiuj
import com.google.common.base.Joiner;

import java.util.Iterator;
import java.util.stream.IntStream;

import static java.lang.System.out;

public class MkStringGuava {
    public static void main(String[] args) {
        Iterator<Integer> nums = IntStream.range(4, 14).iterator();
        String strNums = Joiner.on(' ').join(nums);
        out.println("Tablica: [" + strNums + "]");
    }
}

Java to jednak mimo wszystko głównie (skomplikowane) abstrakcje obiektowe i w takich zastosowaniach generowanie przedziału liczb całkowitych jest dość rzadkim problemem.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 4x, ostatnio: Wibowit
S9
W czym to vavr ma przewagę nad kolekcjami z Javy ?
Wibowit
Jest funkcyjne, a to duży plus :)
rubaszny_karp
a jakby jeszcze były funkcjonalne to ohohohoho #heheszki
Wibowit
jak chcesz mieć wszystko naraz to wybierasz Scalę B-]
WeiXiao
Po co aż tyle linijek? oszczędzaj miejsce na dysku!!! out.println("Tablica: [" + Joiner.on(' ').join(IntStream.range(4, 14).iterator()) + "]"); :D :D
Wibowit
Z vavr.io oszczędzisz jeszcze więcej: out.println(Iterator.range(4, 14).mkString("Tablica: [", " ", "]")); :]
WeiXiao
Niestety na kompilatorach online nie ma Main.java:3: error: package io.vavr.collection does not exist
CountZero
  • Rejestracja:ponad 7 lat
  • Ostatnio:11 miesięcy
  • Postów:262
1

Bez vavra też się da.

Kopiuj
String numbs = Stream
                  .iterate(4, i -> i += 1)
                  .limit(10)
                  .map( x -> x.toString() + " ")
                  .collect(joining(" "));
System.out.println("Tablica: [ " + numbs + "]");

Jak ktoś myśli że Java jest trudna i trzeba się przy niej namęczyć, to niech przez chwilę popiszę w C/C++ - szybko zmieni zdanie (a tak mi się przynajmniej zdaje) :P.

Wibowit
Po co IntStream.range(4, 14) rozbijasz na Stream.iterate(4, i -> i += 1).limit(10)?
CountZero
No w sumie, zapomniałem o tej metodzie.
Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:24 minuty
1

Wersja #3, bez dodatkowych bibliotek:

Kopiuj
import static java.lang.System.out;
import static java.util.stream.Collectors.joining;
import static java.util.stream.IntStream.range;

public class MkString {
    public static void main(String[] args) {
        String strNums = range(4, 14)
                .mapToObj(i -> "" + i)
                .collect(joining(" ", "Tablica: [", "]"));
        out.println(strNums);
    }
}

"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
E1
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 3 lata
  • Postów:27
0

Chyba źle napisałem posta, albo czytający mają problem ze zrozumieniem czytanego tekstu.

Mi najbardziej chodziło o znalezienie odpowiedzi na pytania, a nie o analizę kodu.


Komplikowanie jest proste, upraszczanie jest skomplikowane.
CountZero
  • Rejestracja:ponad 7 lat
  • Ostatnio:11 miesięcy
  • Postów:262
0

No ale jaka jest odpowiedź na to pytanie? Pokazaliśmy Ci, ze w Javie da się to zrobić bardzo prosto i zgrabnie. A że jestes początkujący w Javie, to twoj kod wygląda jak kod początkującego. Jak chcesz się przekonać do kodu Javy, to po prostu w niej pisz, z czasem będzie lepiej.

theacid
Umh. I po co tak kłamać? Od pisania wiecej w Javie lepiej nie będzie. Może być tylko gorzej...
Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:24 minuty
1

@exec1905:
A jaki jest konkretnie problem? Jak na razie to wygląda jakbyś próbował w Javie wymyślać koło od nowa zamiast użyć metod znajdujących się w bibliotece standardowej i/lub w popularnych zewnętrznych bibliotekach Javowych (jak np Google Guava czy Apache Commons). W Pythonie też namiętnie korzysta się z zewnętrznych bibliotek i/ lub importuje metody z biblioteki standardowej, które nie są domyślnie zaimportowane. Ograniczanie się tylko do domyślnie zaimportowanych metod byłoby... hmm... ograniczające. Najpierw poznawaj metody z biblioteki standardowej. Sam widzisz, że za ich pomocą można pisać w miarę zwięzły kod. Jak już poznasz bibliotekę standardową to możesz dorzucić do tego wspomnianą https://github.com/google/guava czy https://commons.apache.org/


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 1x, ostatnio: Wibowit
RO
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:28
0

Piszesz w wątku Java a nie Newbie - pewnie dlatego takie odpowiedzi ;-)

Kod jest podstawowy, nie wiem co jest niezrozumiałe.

Tyle tylko, że tak naprawdę nie potrafię zrozumieć tego kodu. Wygląda on tak:

Kopiuj
class Main {                                                       // deklaracja klasy
  int[] makeRange(int lower, int upper) {            // deklaracja metody
    int[] range = new int[(upper-lower) + 1];        // stworzenie tablicy o określonej ilości elementów

    for (int i = 0; i < range.length; i++) {               // pętla działająca na tablicy
      range[i] = lower++;                                      //  wypełnienie tablicy kolejnymi wartościami od lower do upper
    }
    return range;                                                  // tablica zwracana z metody
  }
  public static void main(String[] arguments) {   // główny program
    int[] range;                                      // tablica bez określenia ilości elementów
    Main lister = new Main();                // stworzenie obiektu klasy Main
    range = lister.makeRange(4,13);    // wypełnienie tablicy przez wywołanie metody makeRange 
                                                            // obiektu (lister) klasy Main
    System.out.print("Tablica: [ ");        // wydruk na konsolę bez znaku nowej lini
    for (int i = 0; i < range.length; i++) {
      System.out.print(range[i] + " ");
    }
    System.out.println("]");                        // zamknięcie lini
  }
}
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
2

Chciałbym się nauczyć nie myśleć Pythonem

To jest pewien mankament nauki Pythona jako pierwszego języka. Bo to jest język bardzo wysokopoziomowy i "ukrywa" wiele rzeczy przed tobą. Pozwala to oczywiscie na szybką naukę np. algorytmów, bo skupiasz się na samym problemie a nie na "technikaliach", ale potem próba wskoczenia w języki trochę niższego poziomu jest bolesna. Jeszcze z Javą to pół biedy, ale jakbyś spróbował przeskoczyć na C to byłoby to jak zderzenie ze ścianą. Przejscie w drugą stronę jest dużo łatwiejsze bo nagle pewne rzeczy robią się "łatwiejsze".

Natomiast dokładnie to samo w Pythonie zajmuje znacznie mniej:

Nie, to nie jest dokładnie to samo. Dokładnie to samo to by było:

Kopiuj
import sys


class Main:
    def makeRange(self, lower, upper):
        rangeList = [None] * ((upper - lower) + 1)
        for i in range(len(rangeList)):
            rangeList[i] = lower
            lower += 1
        return rangeList


def main():
    lister = Main()
    rangeList = lister.makeRange(4, 13)
    sys.stdout.write("Tablica: [ ")
    for i in range(len(rangeList)):
        sys.stdout.write(str(rangeList[i]) + " ")
    sys.stdout.write("]")

main()

I nie jest ani specjalnie krótsze ani bardziej czytelne. A jak już udowodnili koledzy wyżej, w Javie można napisać też to co ty napisałeś w Pythonie, korzystając z bardzo podobnej składni.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 3x, ostatnio: Shalom
jarekr000000
Dałem plusa za ładne podsumowanie, ale nie zgadzam się z fragmentem: Przejscie w drugą stronę jest dużo łatwiejsze. IMo mniej więcej tak samo trudno. Znam nawet więcej ludzi, którzy tkwią mentalnie w warstwie niższej i nie mogą wejść wyżej niż odwrotnie. Sam nie mogę do końca wyleźć z niskopoziomowej javy.
S9
Ja nie moge przejść na Pythona bo jest dynamicznie typowany + nie ma cywilizowanej metody na niemutowalne obiekty. No dobra, w Javie tworzenie Immutable też jest pokretne, ale w keczupie proste jak budowa cepa
Wibowit
nie jest ani specjalnie krótsze ani mniej czytelne - chyba ani bardziej niż ani mniej
E1
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 3 lata
  • Postów:27
0

@Shalom
Skoro "próba wskoczenia w języki trochę niższego poziomu jest bolesna", to jak powinienem podejść do tematu? Jak wymazać sobie z głowy dwa lata nauki?


Komplikowanie jest proste, upraszczanie jest skomplikowane.
Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:24 minuty
0

Nic nie wymazuj tylko najpierw naucz się porządnie chociażby funkcjonalności istniejących w bibliotece standardowej Javy, bo zamiast z niej korzystać wymyślasz koło od nowa. Tak się nie robi, bo im więcej natrzaskasz własnego bezsensownego kodu tym większa szansa, że gdzieś wkradnie się błąd (albo wiele błędów).


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.