Skip to content

Commit c969341

Browse files
refactor: reworked TStringList technique to avoid range check error--but very slow
1 parent 9a7fe26 commit c969341

File tree

1 file changed

+20
-54
lines changed

1 file changed

+20
-54
lines changed

entries/dcornelius/src/uChallengeWithStringList.pas

Lines changed: 20 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -26,67 +26,33 @@ implementation
2626

2727
procedure ChallengeWithStringList;
2828
var
29-
WeatherStream: TStream;
30-
WeatherLines: TStringList;
3129
SortedList: TStringList;
32-
WeatherCity: string;
33-
CityTemp: Integer;
3430
ListCity: Integer;
35-
CurrLine: Int64;
3631
begin
37-
WeatherLines := TStringList.Create;
32+
SortedList := TStringList.Create(TDuplicates.dupAccept, False, True);
3833
try
39-
WeatherLines.Delimiter := ';';
34+
ChallengeCommon.ReadAndParseAllData(procedure (const CityName: string; const CityTemp: Integer)
35+
begin
36+
ListCity := SortedList.IndexOf(CityName);
37+
if ListCity = -1 then
38+
SortedList.AddObject(CityName, TWeatherCity.Create(CityName, CityTemp))
39+
else
40+
TWeatherCity(SortedList.Objects[ListCity]).AddNewTemp(CityTemp);
41+
end);
42+
43+
SortedList.UseLocale := False;
44+
SortedList.Sort;
45+
46+
Write('{');
47+
Write(Trim(TWeatherCity(SortedList.Objects[0]).OutputSumLine(True)));
48+
for var i := 1 to SortedList.Count - 1 do
49+
Write(TWeatherCity(SortedList.Objects[i]).OutputSumLine(False));
50+
Writeln('}');
4051
{$IFDEF DEBUG}
41-
Writeln('Reading from ' + ChallengeCommon.InputFilename);
42-
43-
var StopWatch := TStopwatch.StartNew;
44-
{$ENDIF}
45-
46-
//WeatherLines.LoadFromFile(ChallengeCommon.InputFilename, TEncoding.UTF8);
47-
48-
WeatherStream := TFileStream.Create(ChallengeCommon.InputFilename, fmOpenRead);
49-
try
50-
WeatherLines.LoadFromStream(WeatherStream, TEncoding.UTF8);
51-
finally
52-
WeatherStream.Free;
53-
end;
54-
55-
{$IFDEF DEBUG}
56-
StopWatch.Stop;
57-
Writeln(Format('Loaded %d lines from %s in %d milliseconds', [WeatherLines.Count, ChallengeCommon.InputFilename,
58-
StopWatch.ElapsedMilliseconds]));
52+
Writeln('Unique Stations: ', SortedList.Count);
5953
{$ENDIF}
60-
61-
SortedList := TStringList.Create(TDuplicates.dupIgnore, False, True);
62-
try
63-
// process all rows
64-
for CurrLine := 0 to WeatherLines.Count - 1 do begin
65-
// parse the data and add to our list
66-
if ChallengeCommon.SplitCityTemp(WeatherLines[CurrLine], WeatherCity, CityTemp) then begin
67-
ListCity := SortedList.IndexOf(WeatherCity);
68-
if ListCity = -1 then
69-
SortedList.AddObject(WeatherCity, TWeatherCity.Create(WeatherCity, CityTemp))
70-
else
71-
TWeatherCity(SortedList.Objects[ListCity]).AddNewTemp(CityTemp);
72-
end;
73-
end;
74-
SortedList.UseLocale := False;
75-
SortedList.Sort;
76-
77-
Write('{');
78-
Write(Trim(TWeatherCity(SortedList.Objects[0]).OutputSumLine(True)));
79-
for var i := 1 to SortedList.Count - 1 do
80-
Write(TWeatherCity(SortedList.Objects[i]).OutputSumLine(False));
81-
Writeln('}');
82-
{$IFDEF DEBUG}
83-
Writeln('Unique Stations: ', SortedList.Count);
84-
{$ENDIF}
85-
finally
86-
SortedList.Free;
87-
end;
8854
finally
89-
WeatherLines.Free;
55+
SortedList.Free;
9056
end;
9157
end;
9258

0 commit comments

Comments
 (0)