Methoden String array mit Zahlenwerten korrekt sortieren

Rounnn

Mitglied
Hey, ich muss für eine Übung folgendes erledigen:
Eine CSV-Datei einlesen, großer Datensatz(150mb); Inhalt: Country Code char(2),ASCII City Name varchar(100), City Name varchar(255),State/Region char(2),Population unsigned int, Latitude numeric (float)Longitude numeric (float), 3.3Millionen Städte.
-->soweit kein Problem. über buffered file reader eingelesen in ein Array. Collectionklassen dürfen nicht verwendet werden.

Ausgegeben werden sollen die 20 bevölkerungsreichsten Städte, optional soll die Zahl durch Kommandozeilenparameter variiert werden können.
Momentan sieht die Ausgabe folgendermaßen aus:

47981 //Zahl der Städte mit Bevölkerungszahl
AccentCity(Country)........Population
São Paulo(br)........10021437
Shanghai(cn)........14608512
Bombay(in)........12692717
Delhi(in)........10928270
New Delhi(in)........10928270
Tokyo(jp)........31480498
Seoul(kr)........10323448
Manila(ph)........10443877
Karachi(pk)........11627378
Moscow(ru)........10381288
Dubai(ae)........1137376
Kabul(af)........3043589
Yerevan(am)........1093499
Luanda(ao)........2776125
Cordoba(ar)........1441007
Rosario(ar)........1218497
Vienna(at)........1569315
Adelaide(au)........1074168
Brisbane(au)........1843459

Ich bekomme die Zahlen leider nicht in die Richtige Reihenfolge wie man sieht.
Hier mein bisheriger Quelltext:
[JAVA=0]
package Sort;

import java.util.*;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.util.Comparator;

public class Sortierens
{


public static void main(String[] args) throws Exception
{
// TODO Auto-generated method stub

String[][] liste = new String[0][0];
int rows = 0, cols = 0;


FileInputStream csvstream;
InputStreamReader csvreader;
BufferedReader CSVFile;

try {
String b = "worldcitiespop.txt"; //File location

csvstream = new FileInputStream("C:/Users/synapsenspalt/Documents/JAVA/sUche/bin/"+b); //Datei wird eingelesen
csvreader = new InputStreamReader(csvstream);
CSVFile = new BufferedReader(csvreader);
String dataRow;
while ((dataRow = CSVFile.readLine()) != null){
String[] hilfsarray = dataRow.split(","); //Filtere die Städte heraus, welche eine Bevölkerungszahl haben
if(hilfsarray[4].length() > 0) //erhalte dadurch erforderliche größe unseres Arrays
{
++rows ;
cols = dataRow.split(",").length;
}
else
{
cols = dataRow.split(",").length;
}
}
int l=0; //schließe Input aus CSV-File
CSVFile.close();
System.out.println(rows);
liste = new String[rows][cols];

csvstream = new FileInputStream("C:/Users/synapsenspalt/Documents/JAVA/sUche/bin/"+b);
csvreader = new InputStreamReader(csvstream);
CSVFile = new BufferedReader(csvreader);

while ((dataRow = CSVFile.readLine()) != null )
{
String[] hilfsarray2 = dataRow.split(","); //lese CSV-File in Array ein
if(hilfsarray2[4].length() > 0)
liste[l++] = dataRow.split(",");

}



} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // Read next line of data.

Arrays.sort(liste, new Comp(4));

int uebergabe = 20;
for(String[] line:liste) {
System.out.println(line[2]+"("+line[0]+")"+"........"+line[4]);
if(--uebergabe <=0) break;
}
}
}



class Comp implements Comparator<String[]> // Sortierklasse, da ich Strings vergleiche muss ich
{ // um Arrays.sort() verwenden zu können Vergleichskriterien festlegen

private int spalte;

public Comp (int spalte){ //verglichen wird die Bevölkerungszahl, somit die 5. Spalte der CSV
this.spalte = spalte;

}


public int compare(String[] s1, String[] s2) //liefert die oben genannten Ergebnisse
{
if( (s1[this.spalte]).length()<(s2[this.spalte].length() )) return 1;
if( (s1[this.spalte]).length()>(s2[this.spalte].length() )) return -1;
return 0;


}

//LIEFERN EBENFALLS NICHTS BRAUCHBARES:

//public int compare(String[] s1, String[] s2) {
// return s1[this.spalte].compareTo(s2[this.spalte]);

// int i = s2[this.spalte].length()-(s1[this.spalte]).length();
// return i;



}
[/code]

Würde mich freuen wenn mir jemand einen Tipp geben könnte!
Vorab schonmal ein großes Dankeschön,
Cheers ;)


Anbei noch der Quelltext als Datei.
 

Anhänge

  • Sortierens.java
    2,6 KB · Aufrufe: 4
Zuletzt bearbeitet:

eRaaaa

Top Contributor
Wieso macht ihr euch das Leben selbst schwer (und zusätzlich noch häßlich :D)
Erstelle eine Klasse die eine Stadt repräsentiert, inklusive der Bevölkerungszahl und erstelle dann Objekte dieser. Die Zahl nicht als String speichern sondern als Zahl! (das ist wohl auch einer deiner Probleme, du vergleichst hier Strings in deinem Comparator, keine Zahlen, da kommt nichts gescheites bei raus!) Anschließend Comparator schreiben, Arrays.sort nutzen und alles ist gut :)
 

xehpuk

Top Contributor
Hey,

Stichwort Objektorientierung. Statt alles in String-Arrays zu speichern, solltest du eine Klasse mit (typsicheren) Feldern erstellen.
 

Rounnn

Mitglied
Hey, erstmal danke für den Hinweis, meintest du ca. in die Richtung?

Java:
	class Stadt implements Comparable<Stadt>{
    private int population;
    private String name;
    private String laendercode;    
    public Stadt( String name, String land, int population){
    	this.name = name;
        this.population = population;
        this.laendercode=laendercode;
    }
    
    public int compareTo( Stadt argument ) {
        if( population< argument.population)
            return -1;
        if( population > argument.population )
            return 1;
            
        return 0;
    }

mein Problem ist, dass ich bei:
Java:
	  CSVFile.close();
int l=0;
			  System.out.println(rows);
			
			  meineliste = new Stadt[rows];
			  csvstream = new FileInputStream("C:/Users/synapsenspalt/Documents/JAVA/sUche/bin/"+b);
			  csvreader = new InputStreamReader(csvstream);
			  CSVFile = new BufferedReader(csvreader);
			 
			  while ((dataRow = CSVFile.readLine()) != null  )
			  	{
				String[] hilfsarray2 = dataRow.split(",");			//lese CSV-File in Array ein 
				
					// liste[l++] = dataRow.split(",");
				 if(hilfsarray2[4].length() > 0){
					 int population1=Integer.parseInt(hilfsarray2[4]);                        //<<<------- hier wird die Exception geworfen
					
					 meineliste[l++] = new Stadt(hilfsarray2[2], hilfsarray2[0], population1);
				 }
					
					 
				
			}

folgende Ausgabe erhalte:
Exception in thread "main" java.lang.NumberFormatException: For input string: "Population"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at Sort.Sortierens.main(Sortierens.java:60)

anscheinend mache ich einen nicht so unwesentlichen Fehler beim einlesen in das meineliste-array, vom Typ Stadt.
Wäre dankbar für den einen oder anderen Denkanstoß, danke.
 

xehpuk

Top Contributor
Die Methodik zum Einlesen sieht merkwürdig aus. Was soll
Code:
if(hilfsarray2[4].length() > 0)
?
Was macht der String "Population" in der CSV-Datei? Wie ist diese aufgebaut (konkretes Beispiel)?
 

Rounnn

Mitglied
Die Methodik zum Einlesen sieht merkwürdig aus. Was soll
Code:
if(hilfsarray2[4].length() > 0)
?
Was macht der String "Population" in der CSV-Datei? Wie ist diese aufgebaut (konkretes Beispiel)?

Population ist die Bevölkerungszahl der Städte als unsigned int. Jedoch ist die Bev-Zahl nur für 33.000 von 3,2Millionen Städten in der Datei enthalten. Ergo lese ich sie in kein Array ein. Ist der Wert nicht bekannt, ist die Spalte leer. Somit hat der String im hilfsarray2[4] die Länge null.
Würde ich alle 3,2Mill. Städte einlesen, bekäme ich heapspace-Fehler.

D.h.: ich will die Bevölkerungsreichsten Städte der Welt herausfiltern. Nur 33000 Städte haben eine Angabe!
Bsp:Country,City , AccentCity, Region, Population, Latitude, Longitude
ad, aixas, Aixàs, 06, , 42.4833333, 1.4666667
ad, andorra la vella, Andorra la Vella,07, 20430, 42.5, 1.5166667
hier eine Zeile mit pop u. eine ohne!
 

xehpuk

Top Contributor
So ist dein String nicht leer, sondern er enthält ein Leerzeichen.
Es wird noch immer nicht klar, was der String "Population" in der CSV-Datei zu suchen hat. Du versuchst ihn in eine Zahl umzurechnen, daher fliegt auch die Exception.
Wenn die erste Zeile angeben soll, wofür welche Spalte steht, dann darfst du sie doch nicht als Stadt einlesen.
 

Neue Themen


Oben