[Java-algorytm]

0

Mam plik z którego wyciągam info, dotyczące pracowników i czasu ich pracy. (to wiem)

Problem polega na tym że ich daty pracy (umów), występują wielokrotnie, (wiele umów).

Pytanie:

Czy orientuje się ktoś jak mógłby wyglądac algortym, który obliczał by ilość dni przepracowanych sumując te dni ze wszystkich ich umów. czyli:
zakładam pracownik X miał umowę od 2004/01/01 do 2004/01/31 poczym miał umowę od 2004/05/05 do 2004/05/25 co daje nam że w sumie przepracował 51 dni. i o taki wynik mi chodzi.

Czy ktoś wie ma pomysł jak można by taki algorytm napisać (przynajmniej pomysł jak coś takiego zbudować).</i>

0

Z czym konkretnie masz problem? Wiele zalezy od tego w jakiej postaci dane przechowywane sa w pliku. Jesli masz rozdzielone na kolejne linie okresy zatrudnienia jednego pracownikanp.
Imie i Nazwisko od do
Jan Kowalski 01.01.2005 31.01.2005
Adam Mickiewicz 05.02.2005 04.02.2005
Jan Matejko 05.02.2005 05.05.2005
Jan Kowalski 01.04.2005 01.06.2005 //tu jest powtorzenie nazwiska

to raczej nie ma problemu ze zrobieniem programu ktory to zliczy [green]

0

Dokladnie w tej formie mam dane.

Możesz przynajmniej opisowo powiedzieć mi jak by taki algorytm wyglądał?

0

Jesli chesz przechowywac dane w pamieci w wygodny sposob to skorzystaj z mapy.
Prawdopodobnie dane sa wyeksportowane z jakiegos Excela lub cos w tym stylu. Rozdzielone sa np znakiem tabulacji, wiec przy wczytywaniu rozbijesz je kozystajac ze StringTokenizer (niedawno byl poruszany jego temat.. jakos w przeciagu 1 miesiaca)
zakladam ze raczej potrafisz wczytac dane z pliku. :/
Z jedenj linijki otrzymujesz dane
Imie Nazwisko / od kiedy pracowal / do kiedy pracowal
skorzystaj z klasy Calendar. Za pomoca metody
compareTo(Calendar anotherCalendar)
tej klasy otrzymasz roznice w milisekundach pomiedzy zatrudnieniem od dnia do dnia. Mozesz tez stworzyc dwa obiekty Date i odjac je od siebie - rowniez otrzymasz czas w milisekundach.
Otrzymany wynik dzielisz przez 86 400 000 aby otrzymac liczbe dni
dlaczego akurat przez taka liczbe?
1000 msec = 1sec
60sec = 1min
60min = 1godz
24godz = 1 dzien
wiec 1000 * 60 * 60 * 24 = 86 400 000

Mozesz tez sprobowac zrobic to za pomoca Date i SimpleDateFormat ale nie do konca jestem pewien czy sie uda...
masz wiec juz ilosc przepracowanych dni w okresie jednego zatrudnienia.
sprawdzasz czy taki delikwent ktorego odczytales jest juz w mapie. Jak tak to pobierasz ile mial dotychczas i dodajesz po czym ponownie wstawiasz (mapa sama nadpisze), jak nie to wstawiasz go tam i to juz wszystko :]
bedzie to wygladalo np tak.

SortedMap mapCzasPrzepracowany = new TreeMap();
while (plik_ma_jeszcze_jakies_linijki)
{
  //tu jakies zmienne nazwisko,dataOd, dataDo
    pobierz_delikwenta_i_daty(); 
  Integer CzasWyliczonyPrzedChwila = wylicz_roznice();
  if ( mapCzasPrzepracowany.containsKey(Odczytane_Nazwisko) )
  {
    Integer iCzas = (Integer) mapCzasPrzepracowany.get(Odczytane_Nazwisko);
    iCzas += CzasWyliczonyPrzedChwila;
    mapCzasPrzepracowany.put(Odczytane_Nazwisko, iCzas);
  }
  else
  {
    mapCzasPrzepracowany.put(Odczytane_Nazwisko, CzasWyliczonyPrzedChwila);
  }
}

i to wszystko... pozostaje tylko pobierac z mapy kolejne wartosci. klucze otrzymasz z mapy za pomoca metody keySet, choc lepiej bedzie poruszac sie iteratorem (sprowadza sie w rezultacie do tego samego). Mozliwe ze nie korzystales jeszcze z map, wiec polecam sprobowac
Powinienes sie zmiescic z calym kodem w ok 50-70 linijkach :]

1 użytkowników online, w tym zalogowanych: 0, gości: 1