Quelle est la principale différence entre next()
et nextLine()
?
Mon objectif principal est de lire tout le texte en utilisant un Scanner
qui peut être "connecté" à n’importe quelle source (fichier par exemple).
Lequel devrais-je choisir et pourquoi?
Je préfère toujours lire les entrées à l'aide de nextLine()
, puis analyser la chaîne.
Utiliser next()
ne renverra que ce qui précède un espace. nextLine()
déplace automatiquement le scanner vers le bas après le retour de la ligne en cours.
Un outil utile pour analyser les données de nextLine()
serait str.split("\\s+")
.
String data = scanner.nextLine();
String[] pieces = data.split("\\s+");
// Parse the pieces
Pour plus d'informations sur la classe Scanner ou la classe String, reportez-vous aux liens suivants.
Scanner: http://docs.Oracle.com/javase/7/docs/api/Java/util/Scanner.html
String: http://docs.Oracle.com/javase/7/docs/api/Java/lang/String.html
next()
peut lire l'entrée uniquement jusqu'à l'espace. Il ne peut pas lire deux mots séparés par un espace. De plus, next()
place le curseur sur la même ligne après la lecture de l'entrée.
nextLine()
lit l'entrée, y compris l'espace entre les mots (c'est-à-dire jusqu'à la fin de la ligne \n
). Une fois l’entrée lue, nextLine()
positionne le curseur sur la ligne suivante.
Pour lire toute la ligne, vous pouvez utiliser nextLine()
.
De JavaDoc:
- Un
Scanner
divise son entrée en jetons à l'aide d'un motif de délimiteur, qui correspond par défaut aux espaces.next()
: recherche et renvoie le prochain jeton complet de ce scanner.nextLine()
: fait avancer ce scanner au-delà de la ligne en cours et renvoie l'entrée qui a été ignorée.
Donc, dans le cas de "small example<eol>text"
next()
devrait renvoyer "petit" et nextLine()
devrait renvoyer "petit exemple"
Ce que j’ai remarqué en dehors de next () scanne uniquement jusqu’à l’espace où nextLine () scanne toute la ligne, c’est que next attend qu’elle obtienne un jeton complet où as nextLine () n’attend pas le jeton complet, à chaque fois que '\ n' est obtenu (c'est-à-dire lorsque vous appuyez sur la touche Entrée), le curseur du scanner passe à la ligne suivante et renvoie la ligne précédente ignorée. Il ne vérifie pas si vous avez fourni une entrée complète ou non, même si cela prend une chaîne vide, alors que next () ne prend pas de chaîne vide
public class ScannerTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int cases = sc.nextInt();
String []str = new String[cases];
for(int i=0;i<cases;i++){
str[i]=sc.next();
}
}
}
Essayez ce programme en changeant les boucles next () et nextLine () dans la boucle for, continuez à appuyer sur '\ n', c'est-à-dire touche d'entrée sans aucune entrée, vous pourrez constater qu'en utilisant la méthode nextLine (), elle se termine après avoir appuyé sur nombre de cas où as next () ne se termine pas jusqu'à ce que vous fournissiez et que vous le saisissiez pour le nombre donné de cas.
De javadocs
next () Renvoie le prochain jeton s'il correspond au modèle construit à partir de la chaîne spécifiée . nextLine () Fait avancer ce scanner au-delà de la ligne actuelle et renvoie l'entrée qui a été ignorée.
Le choix que vous choisissez dépend de ce qui convient le mieux à vos besoins. Si c’était moi qui lisais tout un fichier, je choisirais nextLine jusqu’à ce que je dispose de tout le fichier.
Pour cette question, le point clé est de trouver où la méthode s’arrêtera et où se trouvera le curseur après l’appel des méthodes. Toutes les méthodes liront des informations (excluant les espaces) entre la position du curseur et les délimiteurs par défaut suivants (espaces, onglets,\n - créés en appuyant sur Entrée) et le curseur s’arrêtera avant les délimiteurs, à lit les informations (y compris les espaces créés par les délimiteurs) entre la position du curseur et\n et le curseur s’arrête derrière\n.
Par exemple: (| Représentant la position actuelle du curseur; _ représentant des espaces; ;__. Flux en gras les informations obtenues par la méthode d'appel)
23_24_25_26_27\n
Appelez nextInt (); lire 23 | _24_25_26_27\n
Appelez nextDouble (); lire 23 _24 | _25_26_27\n
Appelez next (); lire 23_24 _25 | _26_27\n
Appelez nextLine (); lire 23_24_25_26_27\n |
Après cela, la méthode devrait être appelée en fonction de vos besoins.
En bref: si vous entrez un tableau de chaînes de longueur t, alors Scanner # nextLine () attend t lignes, chaque entrée du tableau de chaînes est différenciée de l’autre par la touche entrée. vous appuyez sur Entrée mais stocke une chaîne (Word) dans le tableau, qui est séparée par des espaces.
Regardons l'extrait de code suivant
Scanner in = new Scanner(System.in);
int t = in.nextInt();
String[] s = new String[t];
for (int i = 0; i < t; i++) {
s[i] = in.next();
}
quand je cours au-dessus de l'extrait de code dans mon IDE (disons pour la longueur de chaîne 2), peu importe si j'entre ma chaîne comme
Entrez comme: - abcd abcd ou
Entrée en tant que: -
a B c d
a B c d
La sortie sera comme Abcd
a B c d
Mais si dans le même code, nous remplaçons la méthode next () par nextLine ()
Scanner in = new Scanner(System.in);
int t = in.nextInt();
String[] s = new String[t];
for (int i = 0; i < t; i++) {
s[i] = in.nextLine();
}
Ensuite, si vous entrez une entrée dans l'invite as - Abcd abcd
La sortie est: -
abcd abcd
et si vous entrez l'entrée dans l'invite sous la forme abcd (et si vous appuyez sur entrée pour entrer abcd suivant sur une autre ligne, l'invite en entrée se ferme et vous obtiendrez le résultat)
La sortie est: -
a B c d
Un scanner interrompt sa saisie dans les jetons en utilisant un motif de délimitation, qui est par défaut connu sous le nom Whitespaces .
Next () utilise pour lire un seul mot et quand il a un espace blanc, il arrête de lire et le curseur revient à sa position originale . NextLine () pendant que celui-ci lit un mot entier même quand il rencontre un espace blanc. le curseur s’arrête à la fin de la lecture et revient à la fin de la ligne . Donc vous n’avez pas besoin d’utiliser un delimeter lorsque vous voulez lire un mot complet en tant que une phrase.vous devez juste utiliser NextLine ().
public static void main(String[] args) {
// TODO code application logic here
String str;
Scanner input = new Scanner( System.in );
str=input.nextLine();
System.out.println(str);
}
Juste pour un autre exemple de Scanner.next () et nextLine () est comme ci-dessous:.
Scanner sc = new Scanner(System.in);
do {
System.out.println("The values on dice are :");
for(int i = 0; i < n; i++) {
System.out.println(ran.nextInt(6) + 1);
}
System.out.println("Continue : yes or no");
} while(sc.next().equals("yes"));
// while(sc.nextLine().equals("yes"));
les méthodes next () et nextLine () sont associées à Scanner et sont utilisées pour obtenir des entrées String. Leurs différences sont ...
next () ne peut lire l'entrée que jusqu'à l'espace. Il ne peut pas lire deux mots séparés par un espace. En outre, next () place le curseur sur la même ligne après la lecture de l'entrée.
nextLine () lit les entrées, y compris les espaces entre les mots (c’est-à-dire jusqu’à la fin de la ligne\n). Une fois l'entrée lue, nextLine () positionne le curseur sur la ligne suivante.
import Java.util.Scanner;
public class temp
{
public static void main(String arg[])
{
Scanner sc=new Scanner(System.in);
System.out.println("enter string for c");
String c=sc.next();
System.out.println("c is "+c);
System.out.println("enter string for d");
String d=sc.next();
System.out.println("d is "+d);
}
}
Sortie:
entrez une chaîne pour cabc def
c est abc
entrer une chaîne pour d
d est def
Si vous utilisez nextLine () au lieu de next (), alors
Sortie:
entrer une chaîne pour c
A B C D E F
c est ABC DEF
entrer une chaîne pour d
GHI
d est GHI
J'ai également eu un problème concernant un délimiteur . La question était tout sur les entrées de
Le problème
La solution
J'ai utilisé le séparateur pour mon scanner et je suis sorti avec succès.
Exemple
public static void main (String args[]){
//Initialize the Scanner this way so that it delimits input using a new line character.
Scanner s = new Scanner(System.in).useDelimiter("\n");
System.out.println("Enter Your Name: ");
String name = s.next();
System.out.println("Enter Your Age: ");
int age = s.nextInt();
System.out.println("Enter Your E-mail: ");
String email = s.next();
System.out.println("Enter Your Address: ");
String address = s.next();
System.out.println("Name: "+name);
System.out.println("Age: "+age);
System.out.println("E-mail: "+email);
System.out.println("Address: "+address);
}
La différence fondamentale est next () est utilisé pour obtenir l'entrée jusqu'à ce que le délimiteur soit rencontré (par défaut, il s'agit d'un espace, mais vous pouvez également le changer) et renvoyer le jeton que vous avez entré. Le curseur reste ensuite sur la même ligne. Alors que dans nextLine (), il balaye l'entrée jusqu'à ce que nous appuyions sur le bouton Entrée, que tout soit renvoyé et que le curseur soit placé sur la ligne suivante. **
Scanner sc=new Scanner(System.in);
String s[]=new String[2];
for(int i=0;i<2;i++){
s[i]=sc.next();
}
for(int j=0;j<2;j++)
{
System.out.println("The string at position "+j+ " is "+s[j]);
}
**
Essayez d’exécuter ce code en donnant à Input le nom "Hello World". Le scanner lit l’entrée jusqu’à "o", puis un délimiteur se produit. Ainsi, s [0] sera "Hello" et le curseur pointera vers la position suivante après le délimiteur ( c'est 'W' dans notre cas), et quand on lit s [1], il scanne le "Monde" et le renvoie à s [1] en tant que prochain jeton complet (par définition de Scanner) .Si nous utilisons nextLine () au lieu de cela, il lira entièrement le "Hello World" et plus encore jusqu'à ce que nous appuyions sur le bouton Entrée et le stockions dans s [0]. Nous pouvons aussi donner une autre chaîne en utilisant nextLine (). Je vous recommande d'essayer d'utiliser cet exemple et plus et de demander des éclaircissements.