 |
Coders' city Nasza pasja to programowanie!
|
| Zobacz poprzedni temat :: Zobacz następny temat |
| Autor |
Wiadomość |
Mikra
Dołączył: 16 Paź 2005 Posty: 487 Skąd: Lublin
|
Wysłany: Pią Sty 27, 2012 10:26 pm Temat postu: [VB 2008] Nietypowe sortowanie danych |
|
|
Mam dane w pliku tekstowym w następującej postaci:
Inżynierska 19/I 6:13 13:15 14:47 16:10 19/II 5:35 6:55 19/III 14:08 15:35 Kruczkowskiego 19/I 7:33 os.Poręba 19/I 5:25 6:53 8:21 14:05 15:29 19/II 5:01 6:15 7:38 19/III 13:15 14:51 16:20
Chciałbym uzyskać dane uporządkowane, czyli czasy odjazdu posortowane wg godziny z zachowaniem wierszy, czyli:
Inżynierska 19/I 6:13 13:15 14:47 16:10 19/II 5:35 6:55 19/III 14:08 15:35 Kruczkowskiego 19/I 7:33 os.Poręba 19/I 5:25 6:53 8:21 14:05 15:29 19/II 5:01 6:15 7:38 19/III 13:15 14:51 16:20
Przyznam, że kompletnie nie wiem, jak się do tego zabrać. Nie mam pomysłu na algorytm, który pozwoliłby na zautomatyzowanie pracy. Za "klasykiem" zapytam: pomożecie?
_________________ lubus.info - lubelskie autobusy i trolejbusy |
|
| Powrót do góry |
|
 |
|
|
samolot
Dołączył: 26 Sty 2006 Posty: 5287 Skąd: Toruń
|
Wysłany: Pią Sty 27, 2012 10:32 pm Temat postu: |
|
|
Uścislij, bo ja widzę dwa przykłady , właściwie takie same, tyle, że w drugim wiersze są bardziej rozstrzelone. Czy to ma być sortowanie każdej ulicy osobno w jej obrębie?
_________________ Vista SP2+VB 2008 EE + .NET 3.5 + IE 9.0.8112 /431 przykładowych programów do Warsztatu programisty (Helion) W życiu bowiem istnieją rzeczy , o które warto walczyć do samego końca. (P. Coelho) |
|
| Powrót do góry |
|
 |
jelcyn Site Admin
Dołączył: 22 Maj 2005 Posty: 1228 Skąd: Rzeszów
|
|
| Powrót do góry |
|
 |
wiesniak

Dołączył: 18 Sty 2012 Posty: 25 Skąd: Gliwice
|
Wysłany: Sob Sty 28, 2012 12:05 am Temat postu: |
|
|
Domyślam się, że chodzi o takie sortowanie aby w każdej kolumnie była tylko jedna wartość, a posortowane były godziny w ramach całej całej linii czasu. Zrobiłbym klasę
| Kod: |  public class GodzinaPrzystanek //
 {
 public DateTime Godzina { get; set; }
 public List<Przystanek> Przystanki {get; set; }
 }
|
Następnie przeleciałbym się przez cały plik i stworzył kolekcję ulic (czyli powiedzmy List<List<GodzinaPrzystanek>>). Jeśli w ramach ulicy godzina by się gdzieś powtarzałast, to oczywiście nie tworzymy drugiego obiektu, tylko dodajemy dla danej godziny kolejny przystanek (dlatego też w GodzinaPrzystanek jest lista przystanków, a nie pojedynczy). Po załadowaniu ulic, każdą kolekcję GodzinaPrzystanek sortujesz po dacie:
| Kod: |  ulica.Sort((gp1,gp2)=> gp1.Godzina.CompareTo(gp2.Godzina))
|
Skoro już masz posortowane, pozostaje to wyświetlić. Żeby wyświetlać ładnie po wierszach, można zrobić mały "obrót" ulicy. Robimy listę przystanków (albo słownik)
| Kod: |  Dictionary<Przystanek, List<DateTime?>> przystankiUlicy;
|
I teraz jedziemy po ulicy:
| Kod: |   foreach(var gp in ulica)
  {
  foreach(var przystanek in przystankiUlicy)
  {
  if(gp.Przystanki.Contains(przystanek))
  {
  przystankiUlicy[Przystanek].Add(gp.Godzina);
  }
  else
  {
  przystankiUlicy[Przystanek].Add(null);
  }
  }
  }
|
W ten oto sposób będziesz miał kolekcję w formie
| Kod: |  
 19/I null 6:13 null 13:15 null 14:47 null 16:10
 19/II 5:35 null 6:55 null null null null null
 19/III null null null null 14:08 null 15:35 null
|
Na koniec pozostaje Ci przelecenie się przez całość i zamiana tego na stringi do wypisania.
PS. Wiem, że w temacie jest VB, ale nie czuję tego języka, dlatego kod jest w C# :-) Operacja gp.Przystanki.Contains(przystanek) może nie zadziałać, bo Contains porównuje po referencjach. Zawsze więc można zrobić coś w stylu gp.Przystanki.Any(x=>x.Nazwa = przystanek.Nazwa). Kod pisałem z palca, bez testów, więc bez gwarancji kompilacji :)
|
|
| Powrót do góry |
|
 |
Mikra
Dołączył: 16 Paź 2005 Posty: 487 Skąd: Lublin
|
Wysłany: Sob Sty 28, 2012 11:43 am Temat postu: |
|
|
Jelcyn:
W Lublinie obowiązuje podobny wzór graficzny rozkładów, ale mnie chodzi o coś innego. Przytoczony powyżej rozkład zawiera podział na brygady, który jest pomocny, gdy np. znajomy kierowca powie, że jutro jeździ na 19/I, co znaczy, iż z pętli "os. Poręba" odjeżdża o 5:25, 6:53, 8:21, 14:05 i 15:29.
Owszem, dwuwymiarowa tablica nie zda egzaminu w przypadku dwóch odjazdów o jednej godzinie, ale takich przypadków w Lublinie na szczęście jest bardzo niewiele (można z powodzeniem zrobić je ręcznie).
wiesniak:
Twój kod jest zbyt mądry, jak dla mnie. ;) Ale jak się zaprzyjaźnię ze słownikami, to przeanalizuję.
Na razie pokombinuję z tablicami.
_________________ lubus.info - lubelskie autobusy i trolejbusy |
|
| Powrót do góry |
|
 |
wiesniak

Dołączył: 18 Sty 2012 Posty: 25 Skąd: Gliwice
|
Wysłany: Sob Sty 28, 2012 8:26 pm Temat postu: |
|
|
W moim kodzie nie ma nic "zbyt mądrego" :-) Powiedz, czego nie rozumiesz, a ja postaram się to wyjaśnić. Słownik jest miłą i prostą strukturą - jest to kolekcja par klucz-wartość. W naszym wypadku kluczem jest przystanek, a wartością lista godzin. Klucz jest unikalny w ramach słownika (czyli ten sam klucz nie może występować więcej niż jeden raz). W ulica.Sort użyłem wyrażenia lambda, ale można je zastąpić zwykłą metodą (tak jak tu: http://msdn.microsoft.com/en-us/library/w56d4y5z.aspx - oczywiście metoda nie musi być statyczna).
To co nazwałem Przystanek, to jest, o ile dobrze rozumiem, brygada - więc to można zmienić. A powiedz, czy forma ostateczna, którą przedstawiłem, to jest to, co byś chciał uzyskać na wyjściu?
|
|
| Powrót do góry |
|
 |
Mikra
Dołączył: 16 Paź 2005 Posty: 487 Skąd: Lublin
|
Wysłany: Sob Sty 28, 2012 9:34 pm Temat postu: |
|
|
Ja to sobie rozwiązałem za pomocą kolekcji ListArray - dodałem wszystkie godziny z danej pętli, posortowałem i chciałem ułożyć po swojemu. Jednak brygady nie zawsze są ułożone po kolei i mój sposób dane wejściowe:
I 7:15 II 5:25 III 5:01 6:25 7:45 IV 6:05
zamiast tak:
I 7:15 II 5:25 III 5:01 6:25 7:45 IV 6:05
"zmiele" następująco:
I 7:15 II 5:25 III 5:01 6:25 7:45 IV 6:05
Myślę dalej. :)
_________________ lubus.info - lubelskie autobusy i trolejbusy |
|
| Powrót do góry |
|
 |
ronin
Dołączył: 27 Kwi 2011 Posty: 39 Skąd: P-ń
|
Wysłany: Wto Sty 31, 2012 8:53 pm Temat postu: |
|
|
Trójwymiarowa tablica ciągów tekstowych, wiersze to brygady, kolumny to liczba przed dwukropkiem, trzeci wymiar wrzucasz (to co po prawej od dwukropka) jak popadnie w trakcie dodawania, a na koniec szeregujesz. W puste miejsca komórki znaki tabulacji lub "skrojony" ciąg spacji.
_________________ Rozwiązania inżynierskie dla budownictwa - konstrukcje stalowe - projektowanie, wykonawstwo oraz montaż wysokościowy. |
|
| Powrót do góry |
|
 |
|
|
Możesz pisać nowe tematy Możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach Możesz dodawać załączniki na tym forum Możesz pobierać pliki z tego forum
|
 Debug: strone wygenerowano w 0.07136 sekund, zapytan = 9
|