Ich habe also diese Datendatei (TXT-Datei), die jeweils einen Bundesstaat und eine Postleitzahl eines Landes hat. In dieser Datendatei habe ich ein Semikolikon, das die Zeichenfolgen für jede Zeile und die Ganzzahlen für jede Zeile trennt. Ich benutze auch eine Schnittstelle und eine Hauptklasse dafür, aber dies ist die Klasse, die den größten Teil der Arbeit erledigen sollte. Und unten ist die Methode.

PS: Ich habe versucht, andere Fragen auf dieser Seite zu finden, die bereits meine Fragen beantworten, aber keine davon hat tatsächlich geholfen!

Dies ist, was die Dat-Datei hat:

75242; Uppsala

90325; Umeå

96133; Boden

23642; Höllviken

35243; Växjö

51000; Jönköping

72211; Västerås

Mein Problem ist, dass ich keinen Weg finden kann, die ganzen Zahlen oder Zeichenfolgen in den Arrays so zu halten, wie ich möchte, dass sie funktionieren. Ich habe versucht, nur Ganzzahlen und nur Zeichenfolgen zu lesen, aber das hat nicht funktioniert. Beachten Sie auch, dass ich versucht habe, jede Zeile und dann jedes Zeichen in der Datendatei zu lesen, um zu versuchen, die Werte in ihre eigenen Arrays zu setzen. Ich habe auch versucht, sie zu verschieben, indem ich if'ments verwendet und "if (Character.is ..)" sage. In der folgenden Methode versuche ich nur, die ganzen Zahlen zu erfassen.

Ich dachte auch, dass ich aufgrund des Semikolons etwas wie "Character.is ...." verwenden sollte, um das zu überprüfen und dann vom Lesen von ch / string zu int überzugehen. Aber ich möchte immer einen Schritt machen, sonst werde ich nichts erledigen!

public void read() {

    try {
        ArrayList<Integer> itemArr = new ArrayList<Integer>();
        ArrayList<String> descArr = new ArrayList<String>();
        FileReader file = new FileReader("C:\\Users\\me\\Desktop\\places.dat");
        BufferedReader r = new BufferedReader(file);
        int r1;

        while ((r.readLine()) != null) {
            while ((r1 = r.read()) != -1) {
                char ch = (char) r1;
                if (Character.isDigit(ch)) {
                    itemArr.add(r.read());
                }
            }
        }

    } catch (IOException e) {

    }
}

Dies ist, was erwartet wird: Sie sind auch sortiert, aber ich kann damit umgehen, solange ich herausfinden kann, wie man die richtigen in jedem ihrer eigenen Arrays speichert.

23642 Höllviken

35243 Växjö

51000 Jönköping

72211 Västerås

75242 Uppsala

90325 Umeå

96133 Boden

Vielen Dank für alle Kommentare, hilft wirklich.

1
Axwell Smith 17 Jän. 2019 im 19:05

4 Antworten

Beste Antwort

Sie können Ihre Logik wie folgt ändern:

String currLine;
while ((currLine = r.readLine()) != null) {
    if (currLine.trim().length() > 0) {
        String[] split = currLine.split(";");
        itemArr.add(Integer.parseInt(split[0]));
        descArr.add(split[1]);
    }
}

Hier teilen wir jede Zeile ( currLine ) basierend auf ; und speichern sie im Array split. Jetzt enthält der 0. Index die Nummer und der 1st Index den String.

Um das itemArr hinzuzufügen, müssen Sie es zu einem int analysieren. Beachten Sie auch, dass die leere Zeile übersprungen wird. Das Sortieren ist jetzt auch ziemlich einfach.

1
Nicholas K 17 Jän. 2019 im 16:15

Sie können die Split-Funktion verwenden und mit ";" wie .dat Datei hat; zwischen Postleitzahl und Zeichenfolge. Wenn Sie möchten, dass die Postleitzahl eine Ganzzahl ist, können Sie die Teile [0] wie folgt analysieren, um eine Idee zu erhalten.

 FileReader file = new FileReader("C:\\Users\\me\\Desktop\\places.dat");
 BufferedReader r = new BufferedReader(file);

  String st;
  while ((st = br.readLine()) != null) {
   String[] parts = st.split[";"] 
   parts[0] // will have zipcode
   parts[1] // will have other part
  }
0
Shivaraj 17 Jän. 2019 im 16:16

Ich empfehle Ihnen, eine neue Klasse zu erstellen, z. B. wo die Nummer und der Name gespeichert werden sollen:

class NumberName {
    Integer number;
    String name;

    // constructor, setter, getter
}

Wenn Sie dann aus einer Datei lesen, fügen Sie sie in eine Liste ein:

FileReader file = new FileReader("C:\\Users\\me\\Desktop\\places.dat");
BufferedReader r = new BufferedReader(file);
String line;

List<NumberName> list = new ArrayList<>();
while ((line = r.readLine()) != null) {
    String[] split = line.split(";");
    list.add(new NumberName(Integer.parseInt(split[0]), split[1]));
}

Dann wird das Sortieren so einfach:

list.sort(Comparator.comparingInt(NumberName::getNumber)); // by number
list.sort(Comparator.comparing(NumberName::getName)); // by name
list.sort(Comparator.comparing(NumberName::getNumber).thenComparing(NumberName::getName)); // by number then by name
0
Schidu Luca 17 Jän. 2019 im 16:19

Die Verwendung von zwei Listen ist übertrieben. Wenn Sie wissen, dass jede Postleitzahl mit jedem Land verknüpft ist, sollten Sie Objekte zum Speichern erstellen und diese dann und in eine Liste aufnehmen.

public class MyLocation {
    private int zipcode;
    private String country;
    public MyLocation(int zipcode, String country) {
        this.zipcode = zipcode;
        this.country = country;
    }
    public int getZipcode() {
        return zipcode;
    }
    public String getCountry() {
        return country;
    }
}

Außerdem haben Sie einen begrenzten Datensatz, den Sie nutzen sollten! Verwenden Sie String.split() und teilen Sie dieses Semikolon auf, um ein Array zu erhalten, in dem beide Elemente zur Extraktion bereit sind.

ArrayList<MyLocation> locations = new ArrayList<>();
try {
    FileReader file = new FileReader("C:\\Users\\me\\Desktop\\places.dat");
    Bufferedreader r = new BufferedReader(file);
    try {
        String line;
        String[] lineValues;

        while ((line = r.readLine()) != null) {
            lineValues = line.split(";");
            MyLocation location = new MyLocation(Integer.valueOf(lineValues[0]), lineValues[1]);
            locations.add(location);
        } 
    } finally {
        r.close();
    }
} catch (IOException e) {
    e.printStackTrace();
}

Es ist auch eine gute Idee, die Ressource zu schließen, wenn Sie sie nicht mehr verwenden. Ich habe meinen Code bearbeitet, um einen Weg zu demonstrieren, dies zu tun.

Wie andere bereits erwähnt haben, müssen Sie beim Sortieren auch Comparable implementieren, aber das ist ziemlich einfach.

0
Stalemate Of Tuning 17 Jän. 2019 im 18:08