Lire .fichier txt en Tableau 2D
Il ya un peu de ces sujets là, mais ce problème a une légère torsion qui le rend différent.
Je me concentre seulement sur la moitié d'un problème plus vaste. Je suis sûr que beaucoup d'entre vous sont au courant des carrés magiques problème.
Invite:
Supposons un fichier avec des lignes et des nombres sur chaque ligne, comme la place indiquée. Écrire un programme qui lit les infos dans un tableau à deux dimensions d'entiers. Le programme doit déterminer si la matrice a est un carré magique ou non.
Solution De Travail:
public static int[][] create2DIntMatrixFromFile(String filename) throws Exception {
int[][] matrix = {{1}, {2}};
File inFile = new File(filename);
Scanner in = new Scanner(inFile);
int intLength = 0;
String[] length = in.nextLine().trim().split("\\s+");
for (int i = 0; i < length.length; i++) {
intLength++;
}
in.close();
matrix = new int[intLength][intLength];
in = new Scanner(inFile);
int lineCount = 0;
while (in.hasNextLine()) {
String[] currentLine = in.nextLine().trim().split("\\s+");
for (int i = 0; i < currentLine.length; i++) {
matrix[lineCount][i] = Integer.parseInt(currentLine[i]);
}
lineCount++;
}
return matrix;
}
public static boolean isMagicSquare(int[][] square) {
return false;
}
Voici mon (ancien) du code pour lire des informations à partir d'un fichier texte dans un tableau 2D:
public static int[][] create2DIntMatrixFromFile(String filename) throws Exception {
int[][] matrix = {{1}, {2}};
File inFile = new File(filename);
Scanner in = new Scanner(inFile);
in.useDelimiter("[/n]");
String line = "";
int lineCount = 0;
while (in.hasNextLine()) {
line = in.nextLine().trim();
Scanner lineIn = new Scanner(line);
lineIn.useDelimiter("");
for (int i = 0; lineIn.hasNext(); i++) {
matrix[lineCount][i] = Integer.parseInt(lineIn.next());
lineIn.next();
}
lineCount++;
}
return matrix;
}
public static boolean isMagicSquare(int[][] square) {
return false;
}
Et voici le fichier texte que je lis de. Il est en forme de 9x9 tableau 2D, mais le programme doit accueillir un tableau d'ambigu taille.
37 48 59 70 81 2 13 24 35
36 38 49 60 71 73 3 14 25
26 28 39 50 61 72 74 4 15
16 27 29 40 51 62 64 75 5
6 17 19 30 41 52 63 65 76
77 7 18 20 31 42 53 55 66
67 78 8 10 21 32 43 54 56
57 68 79 9 11 22 33 44 46
47 58 69 80 1 12 23 34 45
Il y a deux espaces de procéder chaque ligne de but.
Avant que j'ai le problème exact, c'est un des devoirs de modèle afin que la méthode de déclaration et initialisation d'une variable a été pré-déterminé.
Je ne suis pas positif que la méthode même correctement crée un Tableau 2D à partir du fichier parce que je ne peux pas l'exécuter encore. Le problème est que pour une raison "matrix" a été initialisé à 1 colonne et 2 lignes. Pour quelle raison, je ne suis pas sûr, mais dans le but de remplir un tableau avec les numéros à partir du fichier que j'ai besoin de créer un tableau 2D avec des dimensions égal au nombre de valeurs dans une ligne.
J'avais déjà écrit le code pour créer un nouveau tableau 2D
int[line.length()][line.length()]
mais il a créé un 36x36 tableau car c'est le nombre de caractères individuels sont sur une seule ligne. J'ai le sentiment que c'est aussi simple que de boucle à travers la première ligne et d'avoir un compteur de garder une trace de chaque séquence de chiffres séparés par un zéro.
Pour moi, cette solution semble trop inefficace et coûteuse en temps, juste pour trouver les dimensions de la nouvelle matrice. Quelle est la meilleure façon d'accomplir cette? Sans l'aide de ArrayLists que je dois réécrire ce programme après l'utilisation de ArrayLists.
- Pour obtenir les nombres sur une ligne, vous pouvez simplement appeler
line.split(" ");
.
Vous devez vous connecter pour publier un commentaire.
J'ai produit la suite de tableau 2D à partir du fichier que vous avez fournies:
Le tableau des chiffres de la taille de la place lorsqu'il lit la première ligne du fichier. C'est très dynamique. Sa fonctionne tant que le fichier d'entrée est un carré parfait. Je n'ai pas plus d'erreur de manipulation.
Ici est une approche simple qui devrait adhérer à vos directives.
Cette approche s'est affiné et optimisé.
BufferedReader
par opposition àScanner
. Non seulement il a été autour de plus de temps, mais c'est synchronisé! 🙂 Il suffit de suivre les commentaires où je créer le BufferedReader en fonction de vos besoins.Vous êtes proche, mais le changement de votre boucle while pour ressembler à la suivante:
Le changement le plus important que vous pouvez faire pour rendre cela plus facile sur vous-même est d'obtenir vos numéros de ligne-par-ligne. Avec chaque ligne que vous obtenez, il est facile de diviser ensuite dans un tableau de chaînes, de sorte que vous pouvez analyser chaque chiffre séparément. Le faire de cette façon, vous pouvez obtenir la longueur totale de la matrice de tous à la fois sans avoir à avoir de fâcheuses compteurs.
D'abord, tester le Scanner résultats. Je ne pense pas que ces délimiteurs fonctionne. (BTW, Scanner
nextInt()
méthode est à portée de main.)Si vous pouvez supposer que l'entrée est une matrice carrée, de la numérisation de la première ligne de révéler combien de nombres entiers qu'il contient. Ensuite, vous pouvez (re)allouer les tableaux. Puis de traiter toutes les lignes, y compris la première ligne que vous avez déjà numérisées.
Puis vous pouvez définir
matrix = new int[n][n];
Avec Java 8 et c'est Flux:
C'est juste pour la "lecture" d'une partie de la question.