Diskuze: Načítanie hodnôt zo súboru z viacerých stĺpcov, problém s medzerami
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 20 zpráv z 20.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Ahoj, nedá sa mi zaspať tak tu som niečo napísal Na nejasnosti sa kľudne pýtaj
v komentoch nemám síl to nejako viacej popisovať teraz
Snáď som išiel podľa zadania
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
class Main {
private static final String FILE_NAME = "file.txt";
private static final String COLUMNS_DELIMETER = " ";
private static final String LINES_DELIMETER = "\n";
public static void main(String[] args) {
Main main = new Main();
String[][] parsedFile;
try {
int linesCount = main.getLinesCountOfFile(FILE_NAME);
parsedFile = main.parseFileInto2DArray(FILE_NAME, linesCount);
main.print2DArray(parsedFile);
} catch (IOException e) {
e.printStackTrace();
}
}
public void print2DArray(String[][] array){
for(int i = 0; i < array.length; i++){
for(int j = 0; j < array[i].length; j++){
System.out.print(array[i][j]);
System.out.print(COLUMNS_DELIMETER);
}
System.out.print(LINES_DELIMETER);
}
}
public String[][] parseFileInto2DArray(String fileName, int linesCount) throws IOException {
BufferedReader reader = new BufferedReader(new FileReader(fileName));
String[][] result = new String[linesCount][];
int lineIndex = 0;
String line = reader.readLine();
while (line != null) {
result[lineIndex++] = line.trim().split(" ");
line = reader.readLine();
}
reader.close();
return result;
}
public int getLinesCountOfFile(String fileName) throws IOException {
BufferedReader reader = new BufferedReader(new FileReader(fileName));
int linesCount = 0;
while (reader.readLine() != null) {
linesCount++;
}
reader.close();
return linesCount;
}
}
Koukal jsem na to, ten tvůj kód funguje podle zadání, co dala itecko
Podle mě jsou tu tři oblasti, ve kterých by se dal vylepšit - v závislosti
na tom, k čemu ten kod bude:
Súhlasím, že by sa dal vylepšiť a preto som napísal, že nech keď tak
napíše komentár nech to doladíme
Preto som aj pre jednoduchosť vrátil pole Stringov.
Ohľadom medzier, napísala priamo
všetky riadky majú na začiatku 4 medzery a ešte medzi číslami je 1 medzera
A jasné, že keby môže použiť List tak by to bolo úplne o inom Navyše napísala
najskôr zistíť koľko riadkov súbor má, následne na to vytvoriť 2-rozmerné pole
Ahojte chalani,
ďakujem za rýchlu odpoveď a pomoc. Ale mám ešte jednu otázku, skopčila som tvoj kód do NetBeansu a
vyhadzuje mi stále error - java.lang.NoClassDefFoundError. Mohli by ste mi aj
s týmto pomôcť?
Ďakujem.
Pošli screen ako si to tam skopčila aj so štruktúrou projektu a aj celú
chybu sem pošli
Súbor v do ktorého si to skopírovala má názov ATGPriklad1.java preto tak premenuj aj triedu Main čo si tam skopírovala alebo naopak.
Ďakujeem moc, ide mi to.
Ale ešte mám jednu otázku, dá sa to 2D pole prerobiť zo String na int?
Prečo by sa nedalo, ale to si si mohla aj sama skúsiť
public int [][] parseFileInto2DArray(String fileName, int linesCount) throws IOException {
BufferedReader reader = new BufferedReader(new FileReader(fileName));
int[][] result = new int[linesCount][];
int lineIndex = 0;
String[] stringNumbers;
String line = reader.readLine();
while (line != null) {
stringNumbers = line.trim().split(" ");
result[lineIndex++] = stringArrayIntoIntArray(stringNumbers);
//alebo
//result[lineIndex++] = Arrays.stream(stringNumbers).mapToInt(Integer::parseInt).toArray();
line = reader.readLine();
}
reader.close();
return result;
}
public int[] stringArrayIntoIntArray(String[] stringArray){
int[] intArray = new int[stringArray.length];
for(int i = 0; i < stringArray.length; i++){
intArray[i] = Integer.parseInt(stringArray[i]);
}
return intArray;
}
Ale ešte mám jednu otázku, dá sa to 2D pole prerobiť zo String na int?
Neříkal jsem to?
ještě bych navrhoval využít možnosti javy a nepatlat se s managentem
streamů a využít try-with-resources
možná by se i hodilo dát Integer.parseInt do try catch pro případ vadného
souboru
Výsledný kod:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class Main {
private static final String FILE_NAME = "file.txt";
private static final String COLUMNS_DELIMETER = " ";
private static final String LINES_DELIMETER = "\n";
public static void main(String[] args) {
Main main = new Main();
int[][] parsedFile;
try {
int linesCount = main.getLinesCountOfFile(FILE_NAME);
parsedFile = main.parseFileInto2DArray(FILE_NAME, linesCount);
main.print2DArray(parsedFile);
} catch (IOException e) {
e.printStackTrace();
}
}
public void print2DArray(int[][] array){
for(int i = 0; i < array.length; i++){
for(int j = 0; j < array[i].length; j++){
System.out.print(array[i][j]);
System.out.print(COLUMNS_DELIMETER);
}
System.out.print(LINES_DELIMETER);
}
}
public int[][] parseFileInto2DArray(String fileName, int linesCount) throws IOException {
// vyuziti try-with-resources - samo zavre stream
try (BufferedReader reader = new BufferedReader(new FileReader(fileName))) {
int[][] result = new int[linesCount][];
int lineIndex = 0;
String[] stringNumbers;
String line = reader.readLine();
while (line != null) {
stringNumbers = line.trim().split(" ");
result[lineIndex++] = stringArrayIntoIntArray(stringNumbers);
//alebo
//result[lineIndex++] = Arrays.stream(stringNumbers).mapToInt(Integer::parseInt).toArray();
line = reader.readLine();
}
return result;
}
}
public int[] stringArrayIntoIntArray(String[] stringArray){
int[] intArray = new int[stringArray.length];
for(int i = 0; i < stringArray.length; i++){
intArray[i] = Integer.parseInt(stringArray[i]);
/* nebo
// pojistka pro pripad spatneho souboru
try {
intArray[i] = Integer.parseInt(stringArray[i]);
} catch (NumberFormatException e) {
// napr: System.err.println("This is not Integer: " + stringArray[i]);
}
*/
}
return intArray;
}
public int getLinesCountOfFile(String fileName) throws IOException {
// vyuziti try-with-resources - samo zavre stream
try (BufferedReader reader = new BufferedReader(new FileReader(fileName))) {
int linesCount = 0;
while (reader.readLine() != null) {
linesCount++;
}
return linesCount;
}
}
}
měl bych jeden dotaz, už jsme na to narazili:
je naprosto nutné použít 2D pole?
V zadaní mám vyslovene napísané použiť 2D pole, takže si myslím, že áno.
Ďakujeeem moc aj častejšie by sa ti nemuselo dať zaspať. A prepáč, že ťa tak
otravujem.
Nemáš sa za čo ospravedlňovať , rád pomôžem keď viem pomôcť
Tak potom medzi číslami nemusí byť vždy len jedna medzera ako si písala
či? Inak v tých štyroch
screenoch je na riadku 71 vždy niečo iné
Je to možné, no nič nechajme to už tak aj tak moooc ďakujeem za pomoc
Nie je za čo, ale prečo to nedotiahnuť do konca?
tam kde sa spracováva riadok pridaj replaceAll s tým, že chceš viaceré za
sebou medzery nahradiť jednou
stringNumbers = line.trim().replaceAll(" +", " ").split(" ");
Nebo můžeš použít tu zakomentovanou pojistku, co jsem sdílel naposledy, cca 9 komentářů více - i když tam někdo např. místo nuly dá o (písmeno), tak to algoritmus rozchodí
Zobrazeno 20 zpráv z 20.