Forum Coders' city Strona Główna Coders' city
Nasza pasja to programowanie!
 

 PomocPomoc   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy  RejestracjaRejestracja 
Archiwum starego forum + teoria    RSS & Panel/SideBar
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Potrzebuję szybkiej odpowiedzi na moje pytanie... Skrócony regulamin

[VB 2008] Nietypowe sortowanie danych



 
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Visual Studio
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Mikra



Dołączył: 16 Paź 2005
Posty: 487
Skąd: Lublin

PostWysłany: Pią Sty 27, 2012 10:26 pm      Temat postu: [VB 2008] Nietypowe sortowanie danych Odpowiedz z cytatem Pisownia

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
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email Odwiedź stronę autora
samolot



Dołączył: 26 Sty 2006
Posty: 5287
Skąd: Toruń

PostWysłany: Pią Sty 27, 2012 10:32 pm      Temat postu: Odpowiedz z cytatem Pisownia

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
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email
jelcyn
Site Admin


Dołączył: 22 Maj 2005
Posty: 1228
Skąd: Rzeszów

PostWysłany: Sob Sty 28, 2012 12:00 am      Temat postu: Odpowiedz z cytatem Pisownia

Chodzi o tabulatory. Wygląda to na rozkład autobusów i kolega chce, aby np. odjazd o godzinie 7-ej były odpowiednio "rozdzielone" np. nadmiarowym tabulatorem od tego odjazdu o godzinie 9-ej.

Pomysłu hmmm nie mam, może jakoś godziny w dwuwymarową tablicę wpisywać? Ale pojawi się problem, gdy będzie brana pod analizę jakaś inna linia, która ma "zbyt dużo" odjazdów i autobus w ciągu danej godziny ma więcej niż 1 odjazd (np. 15:07 i 15:50). Akurat w analizowanych danych nie było podanego przykładu gdy jest kilka odjazdów w ciągu danej godziny więc nic nie mogę podpowiedzieć, bo nie wiem jak ma być plik posortowany w takiej sytuacji.

Nie wiem do czego te dane są potrzebne. A może w inny sposób graficzny przedstawisz odjazd autobusów? W załączniku jest pokazane, jak wyglądają tabliczki odjazdów MPK Rzeszów (są dość czytelne i mało miejsca zajmują)



mpk.png
 Opis:
mpk rzeszów

Pobierz
 Nazwa pliku:  mpk.png
 Wielkość pliku:  16.34 KB
 Pobierano:  14 raz(y)

Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email Odwiedź stronę autora
wiesniak



Dołączył: 18 Sty 2012
Posty: 25
Skąd: Gliwice

PostWysłany: Sob Sty 28, 2012 12:05 am      Temat postu: Odpowiedz z cytatem Pisownia

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
Zobacz profil autora Wyślij prywatną wiadomość
Mikra



Dołączył: 16 Paź 2005
Posty: 487
Skąd: Lublin

PostWysłany: Sob Sty 28, 2012 11:43 am      Temat postu: Odpowiedz z cytatem Pisownia

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
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email Odwiedź stronę autora
wiesniak



Dołączył: 18 Sty 2012
Posty: 25
Skąd: Gliwice

PostWysłany: Sob Sty 28, 2012 8:26 pm      Temat postu: Odpowiedz z cytatem Pisownia

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
Zobacz profil autora Wyślij prywatną wiadomość
Mikra



Dołączył: 16 Paź 2005
Posty: 487
Skąd: Lublin

PostWysłany: Sob Sty 28, 2012 9:34 pm      Temat postu: Odpowiedz z cytatem Pisownia

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
Zobacz profil autora Wyślij prywatną wiadomość Wyślij email Odwiedź stronę autora
ronin



Dołączył: 27 Kwi 2011
Posty: 39
Skąd: P-ń

PostWysłany: Wto Sty 31, 2012 8:53 pm      Temat postu: Odpowiedz z cytatem Pisownia

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
Zobacz profil autora Wyślij prywatną wiadomość
Wyświetl posty z ostatnich:   
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Visual Studio Wszystkie czasy w strefie CET (Europa)

Strona 1 z 1

 
Skocz do:  
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
contact

| Darmowe programy i porady Jelcyna | VB4all | Tansze zakupy w Helionie |