Implementacja słownika

0

Mam problem w jednym zadaniu, w którym trzeba zaimplementować klasę Słownik<K,V> (oczywiście nie wykorzystując klas bibliotecznych).

Mój kod:

namespace ConsoleApplication8
{
    class Slownik<K, V> where K: IComparable
    {
        public K klucz;
        public V wartosc;
        Slownik<K, V> poprzedni;
        Slownik<K, V> nastepny;

        public void dodaj(K klucz, V wartosc)
        {
            if (CO TUTAJ WSTAWIC?)
            {
                this.klucz = klucz;
                this.wartosc = wartosc;

                this.poprzedni = new Slownik<K, V>();
                this.nastepny = new Slownik<K, V>();
                     
            }

            else
            {
                if (this.klucz.CompareTo(klucz) < 0)
                    this.nastepny.dodaj(klucz, wartosc);
                else
                    this.poprzedni.dodaj(klucz, wartosc);
            }
        }
    }



    class Program
    {
        static void Main(string[] args)
        {
            Slownik<int, string> test = new Slownik<int,string>();
            test.dodaj(1, "asia");
            test.dodaj(2, "basia");
          
            Console.ReadKey();
        }
    }
}

i nie wiem teraz co wstawić w warunku if'a. Chciałoby się wstawić this.klucz == 0, ale nie można.
Prosiłbym o pomoc.
Z góry dzięki.

0

może coś takiego? : this.poprzedni == null && this.nastepny == null

0

Zastanów się dobrze, co chcesz osiągnąć .. bo twój słownik coś dziwnie wygląda. Jak ma ten słownik działać? Co reprezentuje?

0

No w sumie teraz już chyba działa. Słownik ma dodawać nowe elementy.
A czemu mówisz że dziwnie wygląda?

Kurde analizuję to no i faktycznie z tym warunkiem (this.nastepny == null oraz this.poprzedni == null) śmiga wyśmienicie, wszystko tak jak miało być.

0

Co to jest klucz, wartosc, poprzedni i nastepny w tym słowniku? IMHO nie ma to żadnego sensu.

0

No jak: klucz i wartosc to jest po prostu klucz i wartosc w słowniku przecież a poprzedni i następny to referencje do poprzedniego i nastepnego elementu w słowniku. Wszyscy mówią że to nie ma sensu to chociaż powiedzcie co jest źle... albo jak powinno być.

0

to, co zrobiłeś, to jest lista, a nie słownik.

1

to, co zrobiłeś, to jest lista, a nie słownik.

A tam, przesadzasz. Tak jakby napisać że ArrayList to nie lista tylko tablica. Kolekcje rozpoznaje się po interfejsie a nie implementacji.

@autor - dodaj wcale nie zadziała - zastanów się co się stanie dla kodu

test.dodaj(1, "asia");
test.dodaj(2, "basia");

Wtedy test.następny.poprzedni != test, a test.następny.poprzedni.następny.poprzedni` wyrzuci NullPointer bo .następny.poprzedni.następny = null.

0
MSM napisał(a)

A tam, przesadzasz. Tak jakby napisać że ArrayList to nie lista tylko tablica. Kolekcje rozpoznaje się po interfejsie a nie implementacji.

Czyli słowniki implementuje się jako dwukierunkowe listy par klucz-wartość? Przecież to jest co najmniej dziwne.

0

No to jak się implementuje?

0

Mi się wydawało, że jako tablicę (dynamiczną zapewne) par klucz-wartość + parę myków na zwiększenie wydajności.

1
somekind napisał(a)

Mi się wydawało, że jako tablicę (dynamiczną zapewne) par klucz-wartość + parę myków na zwiększenie wydajności.

Ja bym zrobił raczej (dla szybkości) posortowany kopiec list składających się z par hash klucza-wartość :P , ale ogólnie masz rację.

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