Dostęp do komórki w tablicy w ArrayList

0

Cześć, uczę się Javy i napotkałem problem. Kod wygląda następująco:

public static ArrayList getContent(String path) throws IOException {
        ArrayList lines = new ArrayList();
        
        File file = new File(path);

        Scanner src = new Scanner(file);

        while (src.hasNextLine()) {
            String[] data = new String[4];
            
            data = src.nextLine().split(";");
            
            lines.add(data);
        }
        
        return lines;
}

Teraz nie wiem jak się dostać do poszczególnych komórek w tablicy data. Poniższy sposób oczywiście jest niepoprawny.

ArrayList lines = FileExt.getContent("C:/Zawodnicy.txt");
        
for(int i = 0; i < lines.size(); i++) {
     for(int j = 0; j < 4; j++) {
         System.out.println(lines.get(i)[j]);
     }
}

Macie jakieś pomysły?

Pozdrawiam

0

Niepoprawny, czyli? Może plik jest niepoprawny? Poza tym użyj generyków i foreacha. new String[4] jest niepotrzebny, bo split przecież sam tworzy sobie tablicę.

0

Masz plik "C:/Zawodnicy.txt" na dysku?

0

Coś takiego działa:

public static ArrayList getContent(String path) throws IOException {
        ArrayList lines = new ArrayList();
        
        File file = new File(path);

        Scanner src = new Scanner(file);

        while (src.hasNextLine()) {
            //lines.add(src.nextLine().split(";"));
            lines.add(src.nextLine());
        }
        
        return lines;
}
ArrayList lines = FileExt.getContent("C:/Zawodnicy.txt");
        
for(int i = 0; i < lines.size(); i++) {
       System.out.println(lines.get(i));
}

Plik istnieje i jest jak najbardziej poprawny.

Co do typów generycznych i pętli foreach to nie bardzo wiem jak podejść.

0
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {

    List<String[]> getContent(String path) throws IOException {
        List<String[]> lines = new ArrayList<String[]>();

        File file = new File(path);

        //Scanner src = new Scanner(file);
        Scanner src = new Scanner("a;b;c;d\n1;2;3;4"); // prowizorka, bo nie chciało mi się tworzyć pliku na dysku i wklepywać ścieżki

        while (src.hasNextLine()) {
            String[] data = src.nextLine().split(";"); // tej zmiennej nawet tutaj nie trzeba, można od razu wyrażenie włożyć do lines.add()
            lines.add(data);
        }

        return lines;
    }

    void run() throws Throwable {
        List<String[]> lines = getContent("Zawodnicy.txt");

        System.out.println("\"Tradycyjne\" pętle, typ 1:");
        for (int rekord = 0; rekord < lines.size(); rekord++) {
            for (int pole = 0; pole < lines.get(rekord).length; pole++) {
                System.out.println(lines.get(rekord)[pole]);
            }
        }

        System.out.println("\"Tradycyjne\" pętle, typ 2:");
        for (int rekordId = 0; rekordId < lines.size(); rekordId++) {
            String[] rekord = lines.get(rekordId);
            for (int pole = 0; pole < rekord.length; pole++) {
                System.out.println(rekord[pole]);
            }
        }

        System.out.println("Foreach:");
        for (String[] rekord : lines) {
            for (String pole : rekord) {
                System.out.println(pole);
            }
        }
    }

    public static void main(String[] args) throws Throwable {
        new Main().run();
    }
}

Zamiast skakać na głęboką wodę, to poczytaj najpierw "Trails covering the basics" ze strony: http://download.oracle.com/javase/tutorial/

0

Jeszcze dla JDK7:

import java.io.IOException;
import java.nio.file.Paths;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;

public class Main {

    public static List<String[]> getContent(String path) throws IOException {
        List<String[]> lines = new LinkedList<>();
        
        try (Scanner src = new Scanner(Paths.get(path))) {
            while (src.hasNextLine()) {
                lines.add(src.nextLine().split(";"));
            }
        }

        return lines;
    }
    
    public static void main(String[] args) {
        try {
            for (String[] line : getContent("olaboga.txt")) {
                for (String string : line) {
                    System.out.println(string);
                }
            }
        } catch (IOException ex) {
            // ...
        }
    }

}
0

Dzięki Wam bardzo. Widzę, że jeszcze sporo nauki mnie czeka. I co miałeś na myśli Wibowit pisząc żebym nie skakał na głęboką wodę? Zgłębiać tajniki Javy pewnie będę jeszcze długo, okropnie rozbudowany język.

0

Chodziło mniej więcej o to, żebyś więcej czytał, zanim będziesz pisał. A język Java wcale nie jest jakoś mocno rozbudowany. C# już jest bardziej rozbudowany, nie mówiąc o C++ (a tym bardziej o C++11 aka C++0x).

0

Ja wybrałem Javę na następny język, wcześniej programowałem w Delphi, obecnie w PHP. C# z tego co czytałem to nie oferuje więcej niż Java, ale tego nie sprawdzałem. Przyznam, że Twoje zdanie na temat C++, że jest rozbudowany troszkę mnie zaskoczyło.

0

Tu masz szczyptę nowego standardu: http://en.wikipedia.org/wiki/C%2B%2B11
Poza tym założę się, że kiepsko znasz C++, np wiesz jaka jest różnica pomiędzy:

const int * pointer;

, a int * const pointer;

? Albo co daje "const" w definicji: <code class="cpp">typ klasa::metoda(argumenty) const { ciało }

Przejrzyj sobie np źródła biblioteki Boost czy STL i zobacz jakie fajne konstrukcje są w środku i czy je rozumiesz.

Język Java to nie jedyny język na platformę Java, tak samo jak C# to nie jedyny język na platformę .NET. Można użyć np języka Scala na platformie Java, nota bene Scala się świetnie integruje z Javą (zarówno językiem jak i platformą). Scala jest sporo lepsza od Javy czy C#, jednak mało ludzi ją zna.

0

Tzn. można gui zbudować w Javie a obsługę strumieni i inne w scali?

0

Można, ale o ile w Scali łatwo używa się kodu Javowego, to odwrotnie jest już ciężko (ograniczone nazewnictwo składowych, brak funkcji anonimowych itd.).

0

A jak z bibliotekami do gui w scali są już jakieś czy mają być?
Scala ma też latać na dot NET?

0

W bibliotece standardowej - scala.swing (wrappery na swinga ze składnią scala-like)

0

Jest nakładka na Swinga, scala.swing. Tworzenie nowych rozwiązań niekompatybilnych ze Swingiem, typu SWT, nie ma wielkiego sensu, bo wprowadziłoby konieczność tworzenia natywnych bibliotek, a to raczej oznaczałoby więcej problemów niż zysków. Jak wyjdzie JavaFX to pewnie będzie nakładka na JavęFX.

edit:
Za późno.

Scala ma też latać na dot NET?

Generalnie tak, chociaż w sumie większość Scalowych zewnętrznych bibliotek zależy od Javowych. Jeśli wykorzystujesz w Scali Javowe klasy to nie przeniesiesz tego prosto na .NETa, co raczej logiczne.

0

Masz rację C++ znam słabo i materiał z wiki miejscami znaczył dla mnie tyle co nic, czym się różnią te przykłady co podałeś również nie wiem. Jedynie mam pomysł na to:

typ klasa::metoda(argumenty) const { ciało }
  • http://en.wikipedia.org/wiki/C%2B%2B11#Generalized_constant_expressions, ale i tego nie jestem pewien. Odpowiedzi na zadane przez ciebie pytania nie szukałem. Powiem nawet, że zostałem zaskoczony tym czego dowiedziałem się w tym wątku o Javie, była to dla mnie kompletna nowość, nie wspominając o tym, że uświadomiłeś mnie, że C++ to troszkę więcej niż cout << "Hello world!" << endl;
</ul>
.
0

Metoda która nie zmienia stanu obiektu? :)

0

I odpowiedź na poprzednie pytanie http://h30097.www3.hp.com/docs/base_doc/DOCUMENTATION/V40F_HTML/AQTLTBTE/DOCU_045.HTM Nie bardzo widzę zastosowanie

typ klasa::metoda(argumenty) const { ciało }

. Korzystając z tej metody mamy pewność, że stan obiektu będzie nienaruszony, tylko po co nam ta wiedza? Zestawiłem to sobie z interfejsami, ale one dają nam, przynajmniej mi użyteczną wiedzę, a const, gdzie on ma swoje zastosowanie, czy są przypadki w których trzeba byłoby robić coś na około, gdyby użycie const nie wchodziło w grę?

Przepraszam za kolejny już post pod sobą.

0

Oczywiście, że się przydaje, zwłaszcza w:

  1. Środowisku rozproszonym.
  2. Programowaniu zespołowym, długotrwałym utrzymywaniu kodu lub tworzeniu API.

1 => W środowisku rozproszonym ważna jest spójność danych, a więc najlepiej używać obiektów niemutowalnych, a przynajmniej metod niemutujących.
2 => Dość łatwo zapomnieć, czy dana funkcja modyfikuje obiekt, zwłaszcza jeśli klasa jest skomplikowana. Jeśli dochodzi do tego programowanie zespołowe (czyli 99.9 % przypadków), to bez wczytywania się w funkcje, które napisał ktoś inny, nie mamy pewności czy metoda modyfikuje obiekt.

Poczytaj sobie o const-correctness, to jedna z ważnych technik prowadząca do tworzenia wysokiej jakości kodu.

class Klasa {
    int x;
public:

    Klasa(int x) : x(x) {
    }

    int metodaNiemutujaca(int y) const {
        return x * y;
    }

    int metodaMutujaca(int y) {
        x = y;
        return x + 5;
    }

};

int main() {

    const Klasa obiektNiemutowalny(1);
    Klasa obiektMutowalny(2);

    obiektMutowalny.metodaMutujaca(5); // OK
    obiektMutowalny.metodaNiemutujaca(6); // OK
    //obiektNiemutowalny.metodaMutujaca(7); // ZLE - nie skompiluje sie
    obiektNiemutowalny.metodaNiemutujaca(8); // OK

    return 0;
}
0

Ciekawe wydaje się być zastosowanie const przy przekazywaniu parametrów do funkcji/metody.

Dzięki za bardzo wyczerpujące, uczące oraz zmuszające do nauki odpowiedzi.

1 użytkowników online, w tym zalogowanych: 0, gości: 1