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:około 2 godziny
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
Zobacz pozostałe 2 komentarze
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:około 2 godziny
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:około 2 godziny
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:około 2 godziny
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.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)