Rumah >Java >javaTutorial >Bagaimana untuk menyelesaikan masalah membaca carriage return dalam Scanner.nextLine() dalam Java

Bagaimana untuk menyelesaikan masalah membaca carriage return dalam Scanner.nextLine() dalam Java

PHPz
PHPzke hadapan
2023-04-15 09:19:111120semak imbas

Penerangan masalah

Apabila kita menggunakan java untuk membaca input papan kekunci, jika kita mula-mula membaca pembolehubah int dan kemudian membaca rentetan baris seterusnya, kita akan mendapati bahawa hasil yang dijalankan program tidak seperti yang diharapkan, dan atur cara tidak Baris rentetan seterusnya tidak dibaca.

Iaitu, situasi berikut berlaku:

Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
String s=sc.nextLine();

Analisis Masalah

Daripada analisis kod, keperluan kami ialah memasukkan pembolehubah int dahulu, dan kemudian masukkan rentetan pada baris seterusnya, Maksudnya, apabila kita menggunakan papan kekunci untuk memasukkan, kita sebenarnya memasukkan tiga bahagian:

3
perkataan

masing-masing: nombor 3, watak baris baharu, kata rentetan.

Cara menangani pemisah baris tambahan

Seperti yang anda lihat daripada analisis tadi, punca masalahnya ialah kaedah nextLine() tidak membaca rentetan kami, tetapi membaca kami Masukkan aksara baris baharu.

Kaedah 1

Memandangkan terdapat aksara baris baharu tambahan, kita boleh membaca aksara baris baharu sebelum membaca rentetan:

Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
sc.nextLine();//将换行符读掉
String s=sc.nextLine();

Kaedah 2

Buat semula objek Pengimbas:

Scanner sc1=new Scanner(System.in);
int n=sc1.nextInt();
Scanner sc2=new Scanner(System.in);
String s=sc2.nextLine();

Dengan cara ini, selepas n dibaca, aksara baris baharu akan dibuang dan baris seterusnya akan dianggap sebagai sc2 Kedudukan untuk mula membaca.

Pertempuran praktikal

Berikut ialah soalan pertama ujian bertulis magang musim panas 26 April 2020 syarikat tengxun untuk jawatan berkaitan perisian:

Salah satu asas struktur data - baris gilir

Baris gilir mempunyai lima operasi asas, memasukkan penghujung baris gilir, mengalih keluar kepala baris gilir, memadamkan kepala baris gilir, saiz baris gilir dan mengosongkan baris gilir.

Kini membolehkan anda mensimulasikan operasi baris gilir Sila rujuk input untuk format tertentu.

Input penerangan:

Masukkan integer T dalam baris pertama, menunjukkan bahawa akan ada set T data ujian seterusnya.
Untuk setiap set data ujian:
Masukkan integer Q dalam baris pertama, menunjukkan bahawa terdapat operasi Q.
Dalam baris Q seterusnya, setiap baris memasuki kaedah operasi baris gilir Format khusus adalah seperti berikut:
Dalam keadaan awal, baris gilir kosong.
Masukkan penghujung baris gilir: PUSH >Kosongkan baris gilir: CLEAR
11 Operasi dijamin mana-mana satu daripada 5 di atas jenis.


Penerangan output:

Untuk setiap set data ujian:

Jika operasi adalah "keluarkan ketua pasukan", keluarkan elemen ketua bagi pasukan, jika ia tidak boleh dikeluarkan, keluarkan " -1"

Jika operasi adalah "padam kepala baris gilir", jika ia tidak boleh dipadam, keluarkan "-1"
Jika operasi adalah "saiz baris gilir", keluarkan saiz baris gilir

Tidak perlu mengeluarkan operasi lain


Contoh input

2

7

PUSH 1
PUSH 2

TOP
POP
TOP
POP
POP
5
PUSH 1
PUSH 2
SAIZ
POP
SAIZ


Keputusan:

1

2

-1
2

1


Jawapan Soalan

Ini soalan tidak sukar Anda boleh menggunakan LinkedList untuk mencapai operasi di atas Sudah tentu, Queue Pelaksanaan asas pada asalnya LinkedList.

Sebab mengapa saya menyenaraikan soalan ini adalah kerana soalan ini akan menyebabkan masalah kegagalan bacaan nextLine(), kerana kita perlu membaca pembolehubah integer T dahulu, dan kemudian membacanya baris demi baris tidak diproses Masalah aksara Newline akan menyebabkan program berjalan secara tidak normal.

Jawapan AC saya:

Dalam kod di atas, saya mula-mula melihat perbezaan antara q dan input berikut menggunakan

import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc =new Scanner(System.in);
        int t=sc.nextInt();
        while(t>0){
            int q=sc.nextInt();
            List<Integer> n=new LinkedList<>();
            for(int i=0;i<=q;i++){//注意!i<=q,这里的‘=&#39;就是因为q和第一行输入之间的换行符
                String s=sc.nextLine();
                if(s.equals("")){//在这道题中,当我读取到换行符时,直接跳过,不做任何操作
                    continue;
                }
                if(s.startsWith("PUSH")){
                    n.add(Integer.parseInt(s.split(" ")[1]));
                }
                else if(s.equals("TOP")){
                    if(n.size()==0){
                        System.out.println(-1);
                    }
                    else
                        System.out.println(n.get(0));
                }
                else if(s.equals("POP")){
                    if(n.isEmpty()){
                        System.out.println(-1);
                    }
                    else
                        n.remove(0);
                }
                else if(s.equals("SIZE")){
                    System.out.println(n.size());
                }
                else if(s.equals("CLEAR")){
                    n.clear();
                }
            }
            t--;
        }
    }
}
aksara Baris Baharu. Selepas

, apabila watak baris baharu ditemui:
for(int i=0;i<=q;i++)

untuk menyelesaikan masalah.

Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan masalah membaca carriage return dalam Scanner.nextLine() dalam Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam