Hoi,
Voor school heb ik een opdracht om bij verschillende (300K) steden, die uit een DB komen een lengte en een breedte graad te zoeken. Deze staan allemaal in een .csv bestand, dat op de volgende manier is ingericht:
Ik ben dus in de eerste plaats geïnterreseerd, in wanneer een een stad naam invoer (bijvoorbeeld Londen) of hij voorkomt in een van records, onder een van zijn aliassen. Wat ik dus heb gedaan is een grote 2D array maken, en daar alle records met zijn aliassen in gegooid. Ziet er ongeveer zo uit:
Let op dat de array niet voledig gevuld is. Alle 148000 steden zijn ongeveer ingevuld, maar niet allemaal beschikken ze over 10 aliassen.
Dit gaat goed. Nu wil ik erin zoeken. Hier heb ik de volgende functie voor geschreven:
Dit gaat bij het eerste record al fout. Ten minste, lange tijd gaat het goed (tot j =~ 4800, en i = 0, wanneer hij opschuift naar 1 gaat dit fout) en dan geeft hij een error, namelijk
Deze error betekend, zover ik weet, dat hij een array cel probeert uit te lezen die niet is ingevuld. Dit is ten eerste onmogelijk, omdat de stelling i < alias[i].lenght ervoor zorgt dat hij nooit zover kan komen en ten tweede omdat wanneer ik een aantal System.out.println()'s doe, deze gewoon waardes aangeven waaruit nergens blijkt dat cel alias[4800][1] geen waarde heeft. Sterker nog, zelfs [4800][2] zou een waarde moeten hebben en wanneer ik deze afzonderlijk buiten de for loops probeer op te vragen, geeft dit geen problemen.
Iemand enig idee hoe dit kan?
Jan
Voor school heb ik een opdracht om bij verschillende (300K) steden, die uit een DB komen een lengte en een breedte graad te zoeken. Deze staan allemaal in een .csv bestand, dat op de volgende manier is ingericht:
code:
1
2
| naam_stad_1,een_alias__stad_1, een_alias_stad_1, .... , laatste_alias_stad_1|lengtegraad1|breedtegraad1 naam_stad_2,een_alias__stad_2, een_alias_stad_2, .... , laatste_alias_stad_2|lengtegraad2|breedtegraad2. ETC. |
Ik ben dus in de eerste plaats geïnterreseerd, in wanneer een een stad naam invoer (bijvoorbeeld Londen) of hij voorkomt in een van records, onder een van zijn aliassen. Wat ik dus heb gedaan is een grote 2D array maken, en daar alle records met zijn aliassen in gegooid. Ziet er ongeveer zo uit:
code:
1
2
3
4
5
6
7
8
| alias = new String[148000][10] alias[0][0] = "Den Haag"; alias[0][1] = "'s Schravenhage"; alias[0][2] = "Den_Haag"; alias[1][0] = "Katwijk"; alias[1][1] = "Katwyk"; etc. |
Let op dat de array niet voledig gevuld is. Alle 148000 steden zijn ongeveer ingevuld, maar niet allemaal beschikken ze over 10 aliassen.
Dit gaat goed. Nu wil ik erin zoeken. Hier heb ik de volgende functie voor geschreven:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| public String[] getLonLat( String cityName){
// alias is bij het uitvoeren van deze functie al geinitialiseerd.
lonLat = new String[3];
for( int i = 0; i < alias.length; i++ ){
for( int j = 0; j < alias[i].length; j++ ){
if( cityName.equals(alias[i][j])){
lonLat[0] = alias[i][1];
lonLat[1] = data[1];
lonLat[2] = data[2];
j += alias[i].length;
i += alias.length;
}
}
}
return lonLat;
} |
Dit gaat bij het eerste record al fout. Ten minste, lange tijd gaat het goed (tot j =~ 4800, en i = 0, wanneer hij opschuift naar 1 gaat dit fout) en dan geeft hij een error, namelijk
code:
1
| java.lang.ArrayIndexOutOfBoundsException: 152870 |
Deze error betekend, zover ik weet, dat hij een array cel probeert uit te lezen die niet is ingevuld. Dit is ten eerste onmogelijk, omdat de stelling i < alias[i].lenght ervoor zorgt dat hij nooit zover kan komen en ten tweede omdat wanneer ik een aantal System.out.println()'s doe, deze gewoon waardes aangeven waaruit nergens blijkt dat cel alias[4800][1] geen waarde heeft. Sterker nog, zelfs [4800][2] zou een waarde moeten hebben en wanneer ik deze afzonderlijk buiten de for loops probeer op te vragen, geeft dit geen problemen.
Iemand enig idee hoe dit kan?
Jan