Ia o intrare de caractere de la Scanner

Încerc să găsesc o modalitate de a lua o intrare char de la tastatură.

Am încercat să folosesc:

Scanner reader = new Scanner(System.in);
char c = reader.nextChar();

Această metodă nu există.

Am încercat să iau c ca String. Cu toate acestea, nu ar funcționa întotdeauna în toate cazurile, deoarece cealaltă metodă pe care o apelez din metoda mea necesită un char ca intrare. Prin urmare, trebuie să găsesc o modalitate de a lua în mod explicit un char ca intrare.

Aveți nevoie de ajutor?

Soluția

Ai putea lua primul caracter din Scanner.next:

char c = reader.next().charAt(0);

Pentru a consuma exact un singur caracter ați putea folosi:

char c = reader.findInLine(".").charAt(0);

Pentru a consuma exact un singur caracter puteți folosi:

char c = reader.next(".").charAt(0);
Comentarii (12)

Nu există o metodă API pentru a obține un caracter de la Scanner. Trebuie să obțineți șirul folosind scanner.next() și să apelați metoda String.charAt(0) pe șirul returnat.

Scanner reader = new Scanner(System.in);
char c = reader.next().charAt(0);

Pentru a fi siguri cu spațiile albe, puteți, de asemenea, să apelați mai întâi trim() asupra șirului pentru a elimina orice spații albe.

Scanner reader = new Scanner(System.in);
char c = reader.next().trim().charAt(0);
Comentarii (0)

Există trei moduri de abordare a acestei probleme:

  • Apelați next() pe Scanner și extrageți primul caracter din șir (de exemplu, charAt(0)) Dacă doriți să citiți restul liniei sub formă de caractere, iterați peste caracterele rămase în șir. Alte răspunsuri au acest cod.

  • Utilizați setDelimiter("") pentru a seta delimitatorul la un șir gol. Acest lucru va face ca next() să facă tokenizarea în șiruri care au exact un caracter. Astfel, veți putea apela în mod repetitiv next().charAt(0) pentru a itera caracterele. Apoi puteți seta delimitatorul la valoarea sa inițială și puteți relua scanarea în mod normal!

  • Folosiți API de citire în loc de API de scanare. Metoda Reader.read() furnizează un singur caracter citit din fluxul de intrare. De exemplu:

    Reader reader = new InputStreamReader(System.in);
    int ch = reader.read();
    if (ch != -1) { // verifică dacă există EOF
        // avem un caracter ...
    }

Atunci când citiți din consolă prin System.in, datele de intrare sunt de obicei stocate în memoria tampon de către sistemul de operare și sunt eliberate aplicației doar atunci când utilizatorul tastează ENTER. Prin urmare, dacă intenționați ca aplicația dvs. să răspundă la fiecare apăsare individuală a tastaturii, acest lucru nu va funcționa. Va trebui să faceți niște chestii specifice codului nativ al sistemului de operare pentru a dezactiva sau pentru a lucra în jurul valorii de line-buffering pentru consolă la nivelul sistemului de operare.

Referință:

Comentarii (1)