Je suis en train de diffuser un fichier et saisir son contenu dans un tableau 2D. J'ai ce code qui se lit avec succès tout le contenu du fichier. Je souhaite régler mon code de telle manière qu'il saute la première ligne du fichier (# R1 R2 R3 R4 R5) et le numéro de départ de chaque ligne du fichier. D'une certaine manière, je voudrais supprimer tous les éléments qui ont X = 0 et Y = 0 arr [X] [Y]. Je voudrais le faire en lisant le fichier avec le scanner, plutôt que la mise en caisse un nouveau tableau et en passant par le premier et le stockage des données nécessaires dans le nouveau.
Ceci est le fichier transmis en continu:
# R1 R2 R3 R4 R5
1 J S2 Q S2 J
2 J S2 Q S2 J
3 J S2 Q S2 J
4 J S2 Q S2 J
5 J Q S5 Q J
6 S3 Q S5 Q S3
7 S3 Q S5 Q S3
8 S3 Q S5 Q S3
9 S3 S1 S5 S1 S3
10 A S1 S5 S1 A
11 A S1 K S1 A
12 A S1 K S1 A
13 A S1 K S1 A
14 A S1 K S1 A
15 S2 A K A S2
16 S2 A S3 A S2
17 S2 A S3 A S2
18 S2 A S3 A S2
19 S2 A S3 A S2
20 Q S5 S3 S5 Q
21 Q S5 J S5 Q
22 Q S5 J S5 Q
23 Q S5 J S5 Q
24 Q S5 J S5 Q
25 S4 K S2 K S4
26 S4 K S2 K S4
27 S4 K S2 K S4
28 S4 K S2 K S4
29 S4 K S2 K S4
30 K S4 S2 S4 K
31 K S4 A S4 K
32 K S4 A S4 K
33 K S4 A S4 K
34 K S4 A S4 K
35 S1 S4 A S4 S1
36 S1 A S1 A S1
37 S1 A S1 A S1
38 S1 A S1 A S1
39 S1 A S1 A S1
40 Q S3 S1 S3 Q
41 Q S3 Q S3 Q
42 Q S3 Q S3 Q
43 Q S3 Q S3 Q
44 Q J Q J Q
45 S2 J S4 J S2
46 S2 J S4 J S2
47 S2 J S4 J S2
48 S2 S2 S4 S2 S2
49 S2 S2 A S2 S2
50 J S2 A S2 J
51 J S2 A S2 J
52 J Q A Q J
53 J Q A Q J
54 J Q J Q J
55 S5 Q J Q S5
56 S5 J J J S5
57 S5 J J J S5
58 S5 J S1 J S5
59 S5 J S1 J S5
60 A S3 S1 S3 A
61 A S3 S1 S3 A
62 A S3 Q S3 A
63 A S3 Q S3 A
64 A K Q K A
65 S1 K Q K S1
66 S1 K S4 K S1
67 S1 K S4 K S1
68 S1 Q S4 Q S1
69 S1 Q S4 Q S1
70 K Q K Q K
71 K Q K Q K
72 K J K J K
73 K J K J K
74 K J K J K
75 S3 J J J S3
76 S3 NA J NA S3
77 S3 NA J NA S3
78 S3 NA J NA S3
public static void main(String[] args) throws FileNotFoundException
{
Scanner sc = new Scanner(new BufferedReader(new FileReader("reels_template.txt")));
int arrX = 78;
int arrY = 6;
String [][] arr = new String[arrX][arrY];
String[] line = {};
for (int i=0; i<arrX; i++) {
if (sc.hasNextLine()) {
line = sc.nextLine().trim().split("\\s+");
}
for (int j=0; j<arrY; j++) {
arr[i][j] = line[j] + " ";
}
}
for (int i = 0; i < arrX; i++) {
for ( int j = 0; j < arrY; j++) {
System.out.print(arr[i][j]);
}
System.out.println();
}
}
Ceci est la sortie du code ci-dessus:
# R1 R2 R3 R4 R5
1 J S2 Q S2 J
2 J S2 Q S2 J
3 J S2 Q S2 J
4 J S2 Q S2 J
5 J Q S5 Q J
6 S3 Q S5 Q S3
7 S3 Q S5 Q S3
8 S3 Q S5 Q S3
Ceci est la sortie désirée:
J S2 Q S2 J
J S2 Q S2 J
J S2 Q S2 J
J S2 Q S2 J
J Q S5 Q J
S3 Q S5 Q S3
S3 Q S5 Q S3
S3 Q S5 Q S3
EDIT: un problème a été résolu par l'utilisation du scanner pour lire la première ligne avant la boucle supprimant la ligne non désirée et réajustant la seconde boucle. Exemple de code:
public static void main(String[] args) throws FileNotFoundException
{
Scanner sc = new Scanner(new BufferedReader(new FileReader("reels_template.txt")));
final int arrX = 78;
final int arrY = 5;
String[][] arr = new String[arrX][arrY];
String[] line = {};
line = sc.nextLine().trim().split("\\s+");
for (int i=0; i<arrX; i++) {
if (sc.hasNextLine()) {
line = sc.nextLine().trim().split("\\s+");
}
for (int j=0; j<=arrY; j++) {
if (j!=0) {
arr[i][j-1] = line[j] + " ";
}
}
}
for (int i = 0; i < arrX; i++) {
for ( int j = 0; j < arrY; j++) {
System.out.print(arr[i][j]);
}
System.out.println();
}
}
La solution à ce (même si assez évident) la plus simple, serait de lire tout simplement pas les éléments que vous ne voulez pas lire. Votre code sera modifié comme ceci:
public static void main(String[] args) throws FileNotFoundException {
Scanner sc = new Scanner(new BufferedReader(new FileReader("reels_template.txt")));
int arrX = 77;
int arrY = 4;
String [][] arr = new String[arrX][arrY];
String[] line = {};
sc.nextLine(); // remove the first line from the scanner
for (int i=0; i<arrX; i++) {
if (sc.hasNextLine())
line = sc.nextLine().trim().split("\\s+");
for (int j=0; j<arrY; j++) {
arr[i][j] = line[j+1] + " "; //always skips first element of 'line'
}
}
for (int i = 0; i < arrX; i++) {
for ( int j = 0; j < arrY; j++)
System.out.print(arr[i][j]);
System.out.println();
}
}
Mais, ce morceau de code ne fonctionne qu'avec un fichier avec un numéro spécifique de « lignes » et un nombre spécifique d'éléments dans chaque ligne. Que diriez-vous rendre plus « dynamique »?
La méthode suivante, ajoutera chaque ligne du fichier comme String
, dans un ArrayList<String>
. Il va alors supprimer la première ligne non désirée et après cela, le premier numéro devant chaque ligne.
public ArrayList<String> readFileText (String filename){
//ArrayList to hold all the lines
ArrayList<String> lines = null;
//Get lines of text (Strings) as a stream
try (Stream<String> stream = Files.lines(Paths.get(filename))){
// convert stream to a List-type object
lines = (ArrayList<String>)stream.collect(Collectors.toList());
}
catch (IOException ioe){
System.out.println("\nCould not read lines of text from the file.\n" +
"Reason: parameter \"" + ioe.getMessage() + "\"");
}
catch (SecurityException se){
System.out.println("Could not read the file provided." +
"Please check if you have permission to access it.");
}
lines.remove(0); //Remove the first line of the file. Line at index 0.
for(String line : lines)
//Fine the first occurrence of white-space in each line,
//and use that substring, to remove the number of the line.
line = line.substring(line.indexOf(" "));
return lines;
}
Pour utiliser cette méthode dans votre code:
public static void main(String[] args){
ArrayList<String> allFileLines = readFileText("reels_template.txt");
for(String line : allFileLines)
System.out.println(line);
}
Voyez comment plus élégante la principale méthode ressemble maintenant? Voici comment les méthodes sont utilisées. Il faut toujours viser à les rendre plus ont une dynamique nature, plutôt qu'un style hardcoded.