NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!
Mezinárodní den IT společnosti je tady! Pouze nyní můžeš získat 90 % extra kreditů při nákupu od 1199 kreditů s promo kódem AJTACI90. Tak neváhej!
Avatar
Enigma
Člen
Avatar
Enigma:13.4.2021 16:46

Chci poradit, jak zařídit, aby místo předem určené množiny čísel byla uživatelem přes Scanner vytvořena libovolná množina.
Zkoušel jsem několikrát, ale neúspěšně. Nenapadá mě, jak to udělat, aby Scanner nebo nějaký příkaz na stejné bázi fungoval.
S metodou Join dělám teprve necelý týden, proto si s tím ještě nevím moc rady.
Uvedu na příkladu: Místo vypsání čísel z množiny (1,20) chci aby se vypsala množina (x,y) (hranice x a y si zvolí uživatel)
Pro mě není problém Scanner vložit, ale to jak udělat, aby si uživatel vložil množinu (hranice množiny) a aby to mohlo být současně s metodou join().

Zkusil jsem: Tady je zdrojový kód:

public class join {

public static void main(String[] args) throws InterruptedEx­ception {
System.out.prin­tln("Začíná výpis čísel");
PrintNumbers t1 = new PrintNumbers(1,20);
PrintNumbers t2 = new PrintNumbers(21,40);
PrintNumbers t3 = new PrintNumbers(41,60);
PrintNumbers t4 = new PrintNumbers(61,80);
PrintNumbers t5 = new PrintNumbers(81,100);
Thread.sleep(850);
t1.start();
t1.join();
Thread.sleep(850);
t2.start();
t2.join();
Thread.sleep(850);
t3.start();
t3.join();
Thread.sleep(850);
t4.start();
t4.join();
Thread.sleep(850);
t5.start();
t5.join();
Thread.sleep(850);

System.out.prin­tln("Výpis čísel úspěšně skončil.");

}
}

class PrintNumbers extends Thread {

private int začátek;
private int konec;

public PrintNumbers(int start, int end) {
this.začátek = start;
this.konec = end;
}

@Override
public void run() {
for (int i = začátek; i <= konec; i++) {
System.out.prin­tln(Thread.cu­rrentThread()­.getName() + " - " + i);
}
System.out.prin­tln(Thread.cu­rrentThread()­.getName() + " část vypsaná.");
}
}

Kód funguje tak, jak má, chci pouze zařídit, aby si uživatel množiny navolil sám.
Předem děkuji za odpověd.

Chci docílit:

 
Odpovědět
13.4.2021 16:46
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:14.4.2021 7:50

A není to náhodou jeden z úkolů na ITnetworku? (nebo už nevím, těch tutoriálů jsem dělal tolik, že v tom mám guláš).
Pak bych měl pár výhrad

  • Jednak vkládej kód mezi code tagy (když píšeš komentář, tak v tom vrchním panelu máš tento symbol </> tak ten zmáčkneš a pak mezi ty dva tagy vložíš kód.
  • nevím, jestli je to chyba jen u mě - to když tak ať posoudí i ostatní, ale když jsem si tvůj kód zkopíroval, tak tam ty systémové výpisy mají nějaký skrytý znak (ale možná je to můj problém, protože já jsem trošku atypický dev a používám českou lokalizaci - jak systémů tak klávesnice, takže možná je to fakt jen můj problém
  • Proč si nevložíš tu pauzu mezi jednotlivými vlákny přímo na konec metody run? Hned za tu systémovku, která ti vypisuje " část vypsaná.", tak to tam šoupni a nemusíš to tam kopírovat.

No a teď tvůj problémek... Nevím, ale když už si hraješ s vlákny, tak by nemusel být pro tebe takový problém s tím scannerem (obzvlášť, když píšeš, že ho ovládáš :) )
Jednoduše to nahraď třeba přípravou před samotnou logikou prográmku - aneb 90% úvodních tutoriálů zde na ITnetworku :o

Tady máš nejspíš požadované řešení (malinko jsem ti to upravi, jo a třída se nepíše s malým písmenkem :) )

import java.util.Scanner;

public class JoinExample{

    public static void main(String[] args) throws InterruptedException {
        Scanner scanner = new Scanner(System.in, "Windows-1250");
        System.out.println("Zadejte rozmezí od:");
        String startText = scanner.nextLine();
        int start = startText != null && startText.trim().matches("\\d+") ? Integer.parseInt(startText) : 0;
        System.out.println("Zadejte rozmezí do:");
        String endText = scanner.nextLine();
        int end = endText != null && endText.trim().matches("\\d+") ? Integer.parseInt(endText) : 0;
        System.out.println("Začíná výpis čísel");
        runThread(new PrintNumbers(start, end));
        runThread(new PrintNumbers(1, 20));
        runThread(new PrintNumbers(21, 40));
        runThread(new PrintNumbers(41, 60));
        runThread(new PrintNumbers(61, 80));
        runThread(new PrintNumbers(81, 100));

        System.out.println("Výpis čísel úspěšně skončil.");

    }

    private static void runThread(Thread thread) throws InterruptedException {
        thread.start();
        thread.join();
    }
}

class PrintNumbers extends Thread {

    private int začátek;
    private int konec;

    public PrintNumbers(int start, int end) {
        this.začátek = start;
        this.konec = end;
    }

    @Override
    public void run() {
        for (int i = začátek; i <= konec; i++) {
            System.out.println(Thread.currentThread().getName() + " - " + i);
        }
        System.out.println(Thread.currentThread().getName() + " část vpsaná.");
        try {
            Thread.sleep(850);
        } catch (InterruptedException ex) {
        }
    }
}
Nahoru Odpovědět
14.4.2021 7:50
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:14.4.2021 7:59

A protože se mi líbí, že si kluk šikovná a pracuješ na sobě, tak tady ti dám jen tak z legrace ukázku jak by sis mohl hrát s vyskakovacími okny trošku starší technologie :) Je to sice swing, ale na rozdíl od FX, tak tyto metody fungují vždy a všude (zatím tedy ještě).
JOptionPane.sho­wInputDialog() - zobrazí text na ploše
JOptionPane.sho­wInputDialog() - zobrazí okno pro vložení textu
JOptionPane.show­ConfirmDialog() - zobrazí okno s možnostmi ano/ne
Nahraď si místo scanneru JOptionPane, čili nahraď tyto řádky:

Scanner scanner = new Scanner(System.in, "Windows-1250");
        System.out.println("Zadejte rozmezí od:");
        String startText = scanner.nextLine();
        int start = startText != null && startText.trim().matches("\\d+") ? Integer.parseInt(startText) : 0;
        System.out.println("Zadejte rozmezí do:");
        String endText = scanner.nextLine();
        int end = endText != null && endText.trim().matches("\\d+") ? Integer.parseInt(endText) : 0;

těmito

String startText = JOptionPane.showInputDialog("Zadejte rozmezí od:");
int start = startText != null && startText.trim().matches("\\d+") ? Integer.parseInt(startText) : 0;
String endText = JOptionPane.showInputDialog("Zadejte rozmezí do:");
int end = endText != null && endText.trim().matches("\\d+") ? Integer.parseInt(endText) : 0;

Jo a nediv se, že ti nepůjdou záporné hodnoty. jestli je tam chceš, tak stačí odmazat ten regex - matches("\\d+").
Tomuhle se říká regulární výraz a konkrétně déčko znamená přirozená čísla. To plusko neznamená kladné hodnoty, ale že můžeš zadat 1 až nekonečno znaků

Editováno 14.4.2021 8:02
Nahoru Odpovědět
14.4.2021 7:59
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.