Set Java Zachowaj zamówienie
W przeciwieństwie do zestawu standardowego, kolejność danych w uporządkowanym zestawie jest zachowana. Wykorzystaliśmy uporządkowane zestawy, gdy potrzebowaliśmy kolejności, w jakiej wprowadziliśmy dane, które mają być utrzymane w trakcie programu. W uporządkowanym zestawie patrzenie na dane nie zmienia kolejności, jak to miało.
Python uporządkowane zestawy: przegląd
Programowanie dotyczy głównie obsługi danych. Jako programista Python znajdziesz sposoby przechowywania danych w sposób zgodny z twoimi celami. Czasami musisz zachować kolejność wprowadzania danych w zestawie, na przykład, jeśli obsługujesz transakcje bankowe. Każda transakcja musi być wyjątkowa i ważne jest, aby zachować kolejność tworzenia transakcji. Zamawiane zestawy Pythona pomagają ci to zrobić.
W tym artykule wyjaśnimy koncepcję programowania uporządkowanego zestawu, zanim pokazamy, jak utworzyć go w programie Python.
Co to jest w Python?
W języku programowania Python zestaw jest zbiorem unikalnych elementów. Jest to struktura danych oparta na tabeli z skrótem z nieokreślonymi zamawianiem elementów. Możesz przeglądać elementy zestawu, dodać lub usunąć oraz wykonywać standardowe operacje SET, skrzyżowanie, uzupełnienie i różnica.
W przeciwieństwie do list, zwykłe zestawy nie zachowują kolejności, w jakiej wkładamy elementy. Wynika to z faktu, że elementy w zestawie zwykle nie są przechowywane w kolejności.
Co to jest zestaw zamówiony?
W przeciwieństwie do zestawu standardowego, kolejność danych w uporządkowanym zestawie jest zachowana. Wykorzystaliśmy uporządkowane zestawy, gdy potrzebowaliśmy kolejności, w jakiej wprowadziliśmy dane, które mają być utrzymane w trakcie programu. W uporządkowanym zestawie patrzenie na dane nie zmienia kolejności, jak to miało.
Jak utworzyć uporządkowany zestaw w Python
Python umożliwia tworzenie uporządkowanych zestawów w twoich programach. Poniżej pokażemy dwa sposoby: używanie Pythona Zamówiono pakiet i metoda ręczna. Ale najpierw ustalmy kontekst. Załóżmy, że opracowujesz aplikację dla banku, w którym musisz rejestrować numery transakcji jeden po drugim w dokumencie podsumowującym. Każda operacja transakcji bankowej jest wyjątkowa.
Chcesz również, aby kolejność, w której dokonywane są transakcje, które dokładnie odzwierciedlają w zestawie danych. To idealna okazja do użycia Zamówienie klasa zawarta w Python’s ordered_set pakiet.
Zamówiono klasę Pythona
Najprostszym sposobem utworzenia uporządkowanego zestawu w Python jest użycie klasy OrderedSet. Zauważ, że ta klasa nie jest domyślnie uwzględniona. Najpierw musisz upewnić się, że masz Zamówiono Zainstalowany pakiet.
Zauważ, że Zamówiono jest pakietem stron trzecich, a jego funkcjonalność może zmienić niezależnie od wersji Pythona, której używasz. Aby zainstalować pakiet, wpisz następujące polecenie w terminalu:
instalacja PIP zamówiono ustawiony
Umożliwi to korzystanie z klasy OrderedSet.
Teraz możesz utworzyć program Python, który korzysta z klasy OrderedSet. Zobaczmy, jak wygląda prosty uporządkowany zestaw:
Z COMERED_SET IMPORTOWANIE ODMUSZENIE SESTEST = COURTEDSET ([„First”, „Second”, „Second”, „trzeci”]) drukuj (Settest)
Najpierw importujemy świeżo zainstalowany pakiet Order_Set. Następnie tworzymy obiekt poza klasą OrderEdset, przekazując elementy jako parametry. Instrukcja drukowania w tym przykładzie przedstawia następujące:
OrderedSet ([„First”, „drugi”, „trzeci”])
Ciąg „drugi”, który wprowadziliśmy dwukrotnie podczas tworzenia zestawu, już zniknął, a kolejność, w której wprowadziliśmy dane, jest utrzymywane.
Teraz utwórzmy uporządkowany zestaw transakcji bankowych. W scenariuszu w świecie rzeczywistym chcesz zachować kolejność wstawienia, aby umożliwić analizę transakcji, sprawdzić oszustwo i tak dalej. Oto jak może wyglądać program:
Z COMERED_SET IMPORT COMEREDSET BankStatement = OrderedSet ([„BK0001”, „BK0002”, „BK0003”, „BK0004”, „BK0005”]).
Uporządkowany zestaw jest tworzony.
Teraz, jeśli chcesz danej transakcji, możesz wybrać odpowiedni zestaw elementów za pomocą jego indeksu:
. druk („transakcja no”, BankStatement [1], „został pomyślnie zarejestrowany”)
Daje to następujące dane wyjściowe:
Transakcja BK0002 została zarejestrowana pomyślnie
Ale co jeśli ktoś chciałby dodać transakcję, która została już zarejestrowana, na przykład „BK0004”? Gdybyśmy użyli listy, ta akcja byłaby możliwa. Na szczęście uporządkowany zestaw nie pozwala. Uruchommy następujący kod:
Banktrs.Dodaj („BK0004”) druk (BankTrs)
Wynik instrukcji drukowania pozostaje niezmieniony, co dowodzi, że uporządkowany zestaw zlekceważył akcję:
OrderedSet ([„BK0001”, „BK0002”, „Bk0003”, „Bk0004”, „Bk0005”]))
Ta funkcja okazuje się szczególnie przydatna w tym przypadku. Jako programista nie będziesz musiał się martwić o upewnienie się, że każdy członek danych jest wyjątkowy.
Pakiet z zamówieniem zawiera inne godne uwagi funkcje. Pozwala wykonywać przydatne operacje, takie jak różnica, skrzyżowanie i związek za pomocą operatorów -, & i |.
Ustaw operacje
Przepiszmy program, aby utworzyć dwa różne zestawy uporządkowane, które mogą reprezentować dwa wyciągi bankowe.
Z COMERED_SET IMPORT COMEREDSET BankStatement1 = OrderedSet ([„BK0001”, „BK0002”, „BK0003”, „BK0004”, „BK0005”)) BankStatement2 = COMEREDSET ([„BK0004”, „BK0005”, „BK0006”, „BK0007”, „BK0008]])
W obu stwierdzeniach uwzględniliśmy celowo transakcje BK0004 i BK0005. Może tak być, jeśli pierwszy i
1. Jaki jest cel uporządkowanego ustawionego w Python?
Zamówiony zestaw w Python jest używany do zachowania kolejności wprowadzania danych, co jest ważne w scenariuszach takich jak obsługa transakcji bankowych.
2. W jaki sposób zestaw różni się od uporządkowanego zestawu w Python?
Zestaw w Pythonie nie zachowuje kolejności elementów, podczas gdy uporządkowany zestaw.
3. Jak możesz utworzyć uporządkowany zestaw w Python?
Możesz utworzyć zamówiony zestaw w Python za pomocą klasy COMLEDSET z pakietu zamówionego zestawu. Najpierw upewnij się, że pakiet jest zainstalowany, a następnie zaimportuj klasę i utwórz obiekt z żądanymi elementami.
4. Co się stanie, jeśli spróbujesz dodać duplikat do uporządkowanego zestawu?
Zamawiany zestaw nie pozwala na duplikat elementów, więc próba dodania zduplikowanego elementu nie zmieni zestawu.
5. Jakie są pewne zalety korzystania z uporządkowanego zestawu w Python?
Jedną zaletą korzystania z uporządkowanego zestawu jest to, że nie musisz się martwić o zapewnienie unikalnych elementów, ponieważ automatycznie obsługuje duplikaty. Ponadto zachowuje kolejność wstawiania danych, która może być przydatna do analizy i przetwarzania danych.
6. Czy możesz wykonywać operacje, takie jak Union i przecięcie z zamówionym zestawem?
Tak, pakiet zamówienia pozwala wykonywać ustawione operacje, takie jak różnica, skrzyżowanie i związek za pomocą operatorów -i i |.
7. Jak uzyskać dostęp do określonych elementów w zamówionym zestawie?
Możesz uzyskać dostęp do określonych elementów w uporządkowanym zestawie za pomocą indeksu elementu, podobnego do dostępu do elementów na liście.
8. Jest klasą uporządkowaną zawartą domyślnie w Pythonie?
Nie, klasa OrderEdset nie jest domyślnie uwzględniona w Pythonie. Aby go użyć, musisz zainstalować pakiet zamawiany.
9. Czy funkcjonalność pakietu uporządkowanego może się zmieniać niezależnie od wersji Python?
Tak, funkcjonalność pakietu zamówionego jest odrębna od wersji Python, której używasz. Jest to pakiet innych firm, który można aktualizować i zmieniać niezależnie.
10. Jak możesz zainstalować pakiet zamawiany w Python?
Możesz zainstalować pakiet zamówienia w Python za pomocą polecenia PIP w terminalu: „PIP Instaluj zamówienie”.
Set Java Zachowaj zamówienie
W przeciwieństwie do zestawu standardowego, kolejność danych w uporządkowanym zestawie jest zachowana. Wykorzystaliśmy uporządkowane zestawy, gdy potrzebowaliśmy kolejności, w jakiej wprowadziliśmy dane, które mają być utrzymane w trakcie programu. W uporządkowanym zestawie patrzenie na dane nie zmienia kolejności, jak to miało.
Python uporządkowane zestawy: przegląd
Programowanie dotyczy głównie obsługi danych. Jako programista Python, ty’Znajdź sposoby przechowywania danych w sposób zgodny z twoimi celami. Czasami ty’LL musi zachować kolejność wprowadzania danych w zestawie, na przykład, jeśli obsługujesz transakcje bankowe. Każda transakcja musi być wyjątkowa i ważne jest, aby zachować kolejność tworzenia transakcji. Pyton’S zestawy uporządkowane pomagają ci to zrobić.
W tym artykule wyjaśnimy koncepcję programowania uporządkowanego zestawu, zanim pokazamy, jak utworzyć go w programie Python.
Co to jest w Python?
W języku programowania Python zestaw jest zbiorem unikalnych elementów. Jest to struktura danych oparta na tabeli z skrótem z nieokreślonymi zamawianiem elementów. Możesz przeglądać zestaw’elementy, dodaj lub usuń je i wykonuj standardowe operacje związkowe, skrzyżowanie, uzupełnienie i różnica.
W przeciwieństwie do list, zwykłe zestawy nie zachowują kolejności, w jakiej wkładamy elementy. Wynika to z faktu, że elementy w zestawie zwykle nie są przechowywane w kolejności.
Co to jest zestaw zamówiony?
W przeciwieństwie do zestawu standardowego, kolejność danych w uporządkowanym zestawie jest zachowana. Wykorzystaliśmy uporządkowane zestawy, gdy potrzebowaliśmy kolejności, w jakiej wprowadziliśmy dane, które mają być utrzymane w trakcie programu. W uporządkowanym zestawie patrzenie na dane nie zmienia kolejności, jak to miało.
Jak utworzyć uporządkowany zestaw w Python
Python umożliwia tworzenie uporządkowanych zestawów w twoich programach. Poniżej my’ll zademonstrować dwa sposoby: używanie Pythona’S Zamówiono pakiet i metoda ręczna. Ale najpierw niech’S Ustanowienie kontekstu. Pozwalać’Smake You’Ponownie opracowanie aplikacji dla banku, w którym musisz rejestrować numery transakcji jeden po drugim w dokumencie podsumowującym. Każda operacja transakcji bankowej jest wyjątkowa.
Chcesz również, aby kolejność, w której dokonywane są transakcje, które dokładnie odzwierciedlają w zestawie danych. To idealna okazja do użycia Zamówienie Klasa zawarta w Python’S ordered_set pakiet.
Pyton’S Class Set Class
Najprostszym sposobem utworzenia uporządkowanego zestawu w Python jest użycie klasy OrderedSet. Zauważ, że ta klasa nie jest domyślnie uwzględniona. Najpierw musisz upewnić się, że masz Zamówiono Zainstalowany pakiet.
Zauważ, że Zamówiono jest pakietem stron trzecich, a jego funkcjonalność może zmienić niezależnie od wersji Pythona, którą ty’ponowne użycie. Aby zainstalować pakiet, wpisz następujące polecenie w terminalu:
instalacja PIP zamówiono ustawiony
Umożliwi to korzystanie z klasy OrderedSet.
Teraz możesz utworzyć program Python, który korzysta z klasy OrderedSet. Pozwalać’S zobacz, jak wygląda prosty uporządkowany zestaw:
Z COMERED_SET IMPORTOWANIE ODMUSZENIE SESTEST = COURTEDSET ([„First”, „Second”, „Second”, „trzeci”]) drukuj (Settest)
Najpierw importujemy świeżo zainstalowany pakiet Order_Set. Następnie tworzymy obiekt poza klasą OrderEdset, przekazując elementy jako parametry. Instrukcja drukowania w tym przykładzie przedstawia następujące:
OrderedSet ([„First”, „drugi”, „trzeci”])
Ciąg ‘Drugi’ że wprowadziliśmy dwa razy podczas tworzenia zestawu, zniknęła, a kolejność, w której wprowadziliśmy dane, jest utrzymywane.
Teraz pozwól’S Utwórz zamówiony zestaw transakcji bankowych. W scenariuszu w świecie rzeczywistym chcesz zachować kolejność wstawienia, aby umożliwić analizę transakcji, sprawdzić oszustwo i tak dalej. Oto jak może wyglądać program:
Z COMERED_SET IMPORT COMEREDSET BankStatement = OrderedSet ([„BK0001”, „BK0002”, „BK0003”, „BK0004”, „BK0005”]).
Uporządkowany zestaw jest tworzony.
Teraz, jeśli chcesz danej transakcji, możesz wybrać odpowiedni zestaw elementów za pomocą jego indeksu:
. druk („transakcja no”, BankStatement [1], „został pomyślnie zarejestrowany”)
Daje to następujące dane wyjściowe:
Transakcja BK0002 została zarejestrowana pomyślnie
Ale co jeśli ktoś chciałby dodać transakcję, która została już zarejestrowana, na przykład “BK0004”? Gdybyśmy użyli listy, ta akcja byłaby możliwa. Na szczęście uporządkowany zestaw nie pozwala. Pozwalać’s Uruchom następujący kod:
Banktrs.Dodaj („BK0004”) druk (BankTrs)
Wynik instrukcji drukowania pozostaje niezmieniony, co dowodzi, że uporządkowany zestaw zlekceważył akcję:
OrderedSet ([„BK0001”, „BK0002”, „Bk0003”, „Bk0004”, „Bk0005”]))
Ta funkcja okazuje się szczególnie przydatna w tym przypadku. Jako programista wygrałeś’T muszę się martwić o upewnienie się, że każdy członek danych jest wyjątkowy.
Pakiet z zamówieniem zawiera inne godne uwagi funkcje. Pozwala wykonywać przydatne operacje, takie jak różnica, skrzyżowanie i związek za pomocą operatorów -, I I |.
Ustaw operacje
Pozwalać’S Przepisz program, aby utworzyć dwa różne zestawy uporządkowane, które mogą reprezentować dwa wyciągi bankowe.
Z COMERED_SET IMPORT COMEREDSET BankStatement1 = OrderedSet ([„BK0001”, „BK0002”, „BK0003”, „BK0004”, „BK0005”)) BankStatement2 = COMEREDSET ([„BK0004”, „BK0005”, „BK0006”, „BK0007”, „BK0008]])
W obu stwierdzeniach uwzględniliśmy celowo transakcje BK0004 i BK0005. Może tak być, jeśli pierwsze i drugie stwierdzenie częściowo pokrywają ten sam okres.
Jeśli chcesz zobaczyć transakcje, które istnieją tylko w BankStatement1, po prostu uruchom następujący bit kodu:
diff = BankStatement1 - BankStatement2 Drukuj („Transakcje unikalne dla pierwszego podsumowania to”, diff)
Daje nam to następujący wynik:
Transakcje unikalne dla pierwszego podsumowania są uporządkowane ([„BK0001”, „BK0002”, „BK0003”]))
Do celów czytelności możemy otrzymać uporządkowany zestaw interfejsu na liście podczas wyświetlania danych za pomocą tego kodu:
diff = BankStatement1 - BankStatement2 Drukuj („Transakcje unikalne dla pierwszego podsumowania to”, List (diff))
Teraz, jeśli chcesz odzyskać tylko transakcje, które istnieją w obu instrukcjach, użyj instrukcji przecięcia, takiej:
inter = BankStatement1 i BankStatement2 Drukuj („Transakcje wspólne dla obu streszczeń to”, List (Inter))
Ty’Otrzymaj zamierzony wynik:
Transakcje wspólne dla obu streszczeń są uporządkowane [„BK0004”, „BK0005”]
Wreszcie, jeśli chcesz zobaczyć wszystkie transakcje obu stwierdzeń, po prostu wykonaj operację Unii:
Union = BankStatement1 | BankStatement2 Print („Oto wszystkie transakcje tych streszczeń:”, Lis (Union))
To da ci następujące dane wyjściowe:
Oto wszystkie transakcje tych streszczeń: OrderedSet [„Bk0001”, „Bk0002”, „Bk0003”, „Bk0004”, „Bk0005”, „Bk0006”, „Bk0007”, „Bk0008”]
Pakiet Ordered_Set sprawia, że tworzenie i manipulowanie uporządkowanymi zestawami w Python jest proste i skuteczne.
Metoda ręczna
Możliwe jest również całkowicie utworzenie uporządkowanego zestawu danych. Jeśli nie możesz korzystać z pakietu zamawianego, nadal możesz użyć tego obejścia. Pozwalać’S zobacz, jak działa ta metoda.
Najpierw, my’LL Utwórz tablicę ciągów zawierającą nasz zestaw danych:
BankStatement = [„BK0001”, „BK0002”, „BK0003”, „BK0004”, „BK0004”, „BK0005”, „BK0006”]
Następnie tworzymy pętlę, która sprawdza każdy element, szukając duplikatów. Jeśli takie są, zostaną one usunięte z zestawu. Aby to przetestować, my’Ll celowo zawiera duplikat elementu w tablicy.
dla ciągów w zakresie (Len (BankStatement), 1, -1): Jeśli BankStatement [String-1] w BankStatement [: String-1]: BankStatement.Pop (String-1)
For Loop zaczyna się iterować z tyłu listy, to znaczy z ostatniego elementu. Bierze ten element (o nazwie ciąg powyżej) i sprawdza, czy jest już obecny w podzbiorze listy Ale nie uwzględniając bieżącego elementu (ciąg). Jeśli jest już obecny, usuwamy wzmiankę o elemencie bliżej frontu listy, ale prowadzimy oryginalną wzmiankę o elemencie bliżej tyłu listy.
Teraz, kiedy drukujemy treść tablicy, nie ma duplikatów i utrzymanie zamówienia:
[„Bk0001”, „Bk0002”, „Bk0003”, „Bk0004”, „Bk0005”, „Bk0006”]
To pozwala nam utworzyć uporządkowany zestaw, nawet jeśli nie możemy użyć Pythona’s dedykowana funkcja!
Naucz się kodować online
Python to wszechstronny język programowania z kilkoma opcjami tworzenia uporządkowanych zestawów. Możesz użyć klasy OrderedSet, aby wykonać zadanie, lub możesz to zrobić ręcznie w razie potrzeby.
Chcesz wykraczać poza zamówione tworzenie zestawu w Python?
Udacity’S zaprojektowane przez eksperta Wprowadzenie do programowania Nanodegree Program to następny krok. Pod koniec tego kursu, ty’Zna podstawy kodowania i mieć umiejętności, aby pewnie zarządzać scenariuszami programowania w świecie rzeczywistym za pomocą HTML, CSS, Python i innych!
Wypełnij przykłady kodu
Przykład 1: Transakcja bankowa Zamówiono Utworzenie zestawu
Z COMERED_SET IMPORT COMEREDSET BankStatement = OrderedSet ([„BK0001”, „BK0002”, „BK0003”, „BK0004”, „BK0005”).Dodaj („BK0004”) druk (BankTrs)
Przykład 2: różny, związek, skrzyżowanie
Z COMERED_SET IMPORT COMEREDSET BankStatement1 = OrderedSet ([„BK0001”, „BK0002”, „BK0003”, „BK0004”, „BK0005”) BankStatement2 = COURTEDSET ([„BK0004”, „BK0005”, „BK0006”, „BK0007”, „BK0008”] Unikalne dla pierwszego podsumowania to ", List (diff)) inter = BankStatement1 i BankStatement2 Print („ Transakcje wspólne dla obu podsumowania to ", List (Inter)) Union = BankStatement1 | BankStatement2 Print („Oto wszystkie transakcje tych streszczeń:”, List (Union))
Przykład 3: Metoda ręczna
BankStatement = [„BK0001”, „BK0002”, „BK0003”, „BK0004”, „BK0004”, „BK0005”, „BK0006”] dla ciągów w zakresie (LEN (BankStatement), 1, -1): If BankStatement [String-1] w BankStatement [: String-1]: BankStatementem.Pop (String-1) print (BankStatement)
Set Java Zachowaj zamówienie?
Czy zestaw Java zachowuje zamówienie? Metoda zwraca do mnie zestaw i podobno dane są uporządkowane, ale iterowanie przez zestaw, dane są nieuporządkowane. Czy istnieje lepszy sposób na zarządzanie tym? Czy metodę należy zmienić, aby zwrócić coś innego niż zestaw?
30.6K 27 27 Złote odznaki 91 91 Srebrne odznaki 100 100 brązowych odznaki
zapytał 25 maja 2012 o 10:27
User840930 User840930
5 084 21 21 złote odznaki 62 62 Srebrne odznaki 93 93 Brązowe odznaki
„Elementy są zwracane w żadnej określonej kolejności (chyba że ten zestaw jest instancją niektórych klas, która zapewnia gwarancję).„Mówi metoda iteratora dla zestawu. Znaleziono tutaj
25 maja 2012 o 10:29
13 Odpowiedzi 13
Interfejs ustawiony nie zawiera żadnych gwarancji zamówienia.
Jego pod-interfejs sortedset reprezentuje zestaw sortowany zgodnie z pewnym kryterium. W Java 6 istnieją dwa standardowe kontenery, które zaimplementują SortEdset . Są drzewami i concurrentSkiplistset .
Oprócz interfejsu SortEdset istnieje również klasa LinkedHashset. Pamięta kolejność, w jakiej elementy zostały włożone do zestawu i zwraca swoje elementy w tej kolejności.
10.9K 10 10 złotych odznaki 70 70 Srebrnych odznak 94 94 Brązowe odznaki
odpowiedział 25 maja 2012 o 10:30
483K 107 107 Złote odznaki 943 943 Srebrne odznaki 1007 1007 brązowe odznaki
Ponadto, ze względu na różne haszowanie strun w Javie 8, domyślne (nieprojektowane) zamówienie w zestawach i mapach zmieni się. Jeśli polegasz na zamówieniach nieporządkowanych, Twój kod będzie zachowywał się inaczej w Javie 8.
17 listopada 2014 o 16:15
Rozumiem, że klasa nie zamawiająca jest normalna, ale zachowanie, którego się spodziewałem, polegało na ich opuszczeniu, gdy zostały wprowadzone, a nie bałaganu z zamówieniem, zamiast tego po prostu tasuje elementy za każdym razem, gdy się agreguje. Twoje rozwiązanie nie jest optymalne, ponieważ wtedy będę musiał zaimplementować całą strukturę, aby były sortowane w taki sam sposób, w jaki zostały wprowadzone: s
25 lutego 2019 o 8:39
Is. Istnieją uporządkowane zestawy, ale kolejność jest określona przez relację (komparator w Javie), ponownie dopasowując definicję w teorii zestawu do definicji w Javie. Twoje oczekiwanie na utrzymanie kolejności wstawiania prawdopodobnie pochodzi z list, ale zestawy nie są listami.
9 sierpnia 2019 o 10:53
4 396 11 11 Złote odznaki 34 34 Srebrne odznaki 58 58 Brązowe odznaki
odpowiedział 25 maja 2012 o 10:29
Xiaofeng.Li Xiaofeng.Li
8117 2 2 złote odznaki 23 23 Srebrne odznaki 30 30 brązowe odznaki
Lista nie jest zestawem (nie gwarantuje wyjątkowości członkostwa).
6 czerwca 2013 o 22:03
W wielu biznesowych lista przypadków nie można użyć tylko do zachowania zamówienia zamiast zestawu. LinkedHashset utrzymuje zamówienie i przechowuje unikalne.
9 lipca 2015 o 15:34
Jak zasugerowało wielu członków LinkedHashset Aby zachować kolejność kolekcji. Możesz owinąć swój zestaw za pomocą tej implementacji.
Sortedset Implementacja może być używana do sortowanego zamówienia, ale do twojego celu używają LinkedHashset.
Także z dokumentów,
„Ta implementacja oszczędza swoich klientów z nieokreślonych, ogólnie chaotycznych zamówień dostarczanych przez Hashset, bez ponoszenia zwiększonych kosztów związanych z drzewami. Można go użyć do stworzenia kopii zestawu, który ma taką samą kolejność co oryginał, niezależnie od implementacji oryginalnego zestawu: ”
Czy ustawia Utrzymanie kolejności wstawiania?
Gdy elementy pochodzą z skrótu z powodu haszu, który wprowadzili, nie jest utrzymywane podczas pobierania. Hashset przechowuje elementy za pomocą mechanizmu zwanego haszkiem. Możemy osiągnąć dane zadanie za pomocą LinkedHashset. Klasa LinkedHashset implementuje podwójnie połączoną listę, aby mogła przejść przez wszystkie elementy.
Przykład:
Wejście : HashsetInput = Wyjście: HashsetPrint = Wejście : HashsetInput = Wyjście: HashsetPrint =
Wdrożenie z Hashset: (Zamówienie nie jest utrzymane)
Składnia:
Hashset num = new Hashset ();
Zbliżać się:
- Utwórz obiekt hashset.
- Włóż wiele elementów w skrócie.
- Wydrukuj hashset.(Zamówienie nie jest utrzymane)
Poniżej znajduje się wdrożenie powyższego podejścia:
gmamaladze / A_README.MD
Wiele osób naiwnie zakłada zwykłe .Net Hashset zachowuje kolejność wstawiania. Rzeczywiście Hashset przypadkowo zachowuje kolejność wstawiania, dopóki nie usuniesz i ponownie dodasz niektórych elementów. Istnieje taka struktura danych w Java – LinkedHashset, która szanuje kolejność i ma O (1) RW czas.
Nie, nie znalazłem (działającego) odpowiedniego wdrożenia w .INTERNET. To napisałem.
Implementacja wykorzystuje powiązaną listę w połączeniu ze słownikiem do zdefiniowania iteracji, zamawiania i jednocześnie pozwala na usunięcie O (1).
Zamówienie jest nie dotknięte, jeśli element jest Ponownie zawarte do zestawu zachowuje swoją starą pozycję.
Ten kod jest dystrybuowany na podstawie licencji MIT. Prawa autorskie (c) 2013 George Mamaladze Zobacz licencję.txt lub http: // openSource.org/licencje/licencja mit.php
Ten plik zawiera dwukierunkowy tekst Unicode, który może być interpretowany lub skompilowany inaczej niż to, co pojawia się poniżej. Aby przejrzeć, otwórz plik w edytorze, który ujawnia ukryte znaki Unicode. Dowiedz się więcej o dwukierunkowych znakach Unicode
// Ten kod jest dystrybuowany na podstawie licencji MIT. Prawa autorskie (c) 2013 George Mamaladze |
// patrz licencja.txt lub http: // openSource.org/licencje/licencja mit.php |
za pomocą systemu . Kolekcje; |
za pomocą systemu . Kolekcje . Ogólny ; |
Przestrzeń nazw GMA . Datastructure |
Zamówienie klasy publicznej < T >: Icollection |
Prywatny odczyt idicy < T , LinkedListNode < T >> m_dictionary; |
Prywatny odczyt LinkedList < T >m_linkedList; |
Public Orderedset () |
: to (EqualityComparer < T >. Domyślny ) |
> |
Zamówienie publiczne (ieEqualicomParer < T >porównanie) |
m_dictionary = nowy słownik < T , LinkedListNode < T >> (Comparator); |
m_linkedList = nowa LinkedList < T >(); |
> |
public int Count |
Dostawać |
> |
publiczne wirtualne bool isreadonly |
Dostawać |
> |
ICOLLECTION ICOID < T >. Dodaj (element T) |
Dodaj Przedmiot ) ; |
> |
public void clear () |
m_linkedList . Jasne ( ) ; |
m_dictionary . Jasne ( ) ; |
> |
Public Bool Usuń (pozycja T) |
LinkedListNode < T >węzeł; |
BOOL Znaleziono = m_dictionary . TrygetValue (element, out node); |
Jeśli ( ! znaleziono) zwróć false; |
m_dictionary . Usuń przedmiot ) ; |
m_linkedList . Usuń (węzeł); |
zwrócić true; |
> |
publiczny IENUMERator < T >Getenumerator () |
return m_linkedList . Getenumerator (); |
> |
IEnumerator Ienumerable . Getenumerator () |
return getenumerator (); |
> |
Publiczne bool zawiera (przedmiot t) |
return m_dictionary . Zawiera (pozycję); |
> |
public void copo (t [] tablica, int arrayindex) |
m_linkedList . CopoTo (Array, ArrayIndex); |
> |
Public Bool Add (pozycja T) |
if (m_dictionary . Zawiera (item)) zwrócić false; |
LinkedListNode < T >node = m_linkedList . AddLast (item); |
m_dictionary . Add (item, węzeł); |
zwrócić true; |
> |
> |
> |
Ten plik zawiera dwukierunkowy tekst Unicode, który może być interpretowany lub skompilowany inaczej niż to, co pojawia się poniżej. Aby przejrzeć, otwórz plik w edytorze, który ujawnia ukryte znaki Unicode. Dowiedz się więcej o dwukierunkowych znakach Unicode
// Ten kod jest dystrybuowany na podstawie licencji MIT. Prawa autorskie (c) 2013 George Mamaladze |
// patrz licencja.txt lub http: // openSource.org/licencje/licencja mit.php |
za pomocą systemu; |
za pomocą systemu . Kolekcje . Ogólny ; |
za pomocą systemu . Linq; |
Przestrzeń nazw GMA . Datastructure |
Organizowanie klasy publicznej < T >: Zamówienie < T >, Ustawiłem |
Public OrderedSetExt () |
> |
Publiczne uporządkowanie (IEqualityComparer < T >porównanie) |
: baza (komparant) |
> |
Publiczne uporządkowanie (INumerable < T >kolekcja ) |
: to (kolekcja, EqualicomCarer < T >. Domyślny ) |
> |
Publiczne uporządkowanie (INumerable < T >Kolekcja, ieEqualicomParer < T >porównanie) |
: ten (porównawczy) |
Foreach (pozycja T w kolekcji) |
Dodaj Przedmiot ) ; |
> |
> |
/// |
/// modyfikuje bieżący zestaw, aby zawierał wszystkie elementy obecne zarówno w bieżącym zestawie, jak i w |
/// określona kolekcja. |
/// |
/// Kolekcja do porównania z bieżącym zestawem. |
/// |
Public void UnionWith (INumerable < T >Inny ) |
if (inne == null) rzuć nowe argumentnullexception („inne”); |
Foreach (element t w innych) |
Dodaj (element); |
> |
> |
/// |
/// modyfikuje bieżący zestaw, aby zawierał tylko elementy, które są również w określonej kolekcji. |
/// |
/// Kolekcja do porównania z bieżącym zestawem. |
/// |
Public Void przecinają < T >Inny ) |
Foreach (element t w innych) |
if (zawiera (element)) kontynuuj; |
Usuń (element); |
> |
> |
/// |
/// usuwa wszystkie elementy w określonej kolekcji z bieżącego zestawu. |
/// |
/// Zbiór elementów do usunięcia z zestawu. |
/// |
Publiczna pustka z wyjątkiem (INumerable < T >Inny ) |
Foreach (element t w innych) |
Usuń (element); |
> |
> |
/// |
/// modyfikuje bieżący zestaw, aby zawierał tylko elementy obecne w bieżącym zestawie lub w |
/// określona kolekcja, ale nie oba. |
/// |
/// Kolekcja do porównania z bieżącym zestawem. |
/// |
public void Symmetricexceptwith (INumerable < T >Inny ) |
if (inne == null) rzuć nowe argumentnullexception („inne”); |
Foreach (element t w innych) |
if (zawiera (element)) |
Usuń (element); |
> |
w przeciwnym razie |
Dodaj (element); |
> |
> |
> |
/// |
/// określa, czy zestaw jest podzbiorem określonego kolekcji. |
/// |
/// |
/// Prawda, jeśli bieżący zestaw jest podzbiorem; W przeciwnym razie fałsz. |
/// |
/// Kolekcja do porównania z bieżącym zestawem. |
/// |
public bool issubsetof (ieeNumerable < T >Inny ) |
if (inne == null) rzuć nowe argumentnullexception („inne”); |
var intehhasset = nowy hashset < T >( Inny ) ; |
zwróć inny Hashset . Ispersetof (this); |
> |
/// |
/// określa, czy bieżący zestaw jest supersetem określonej kolekcji. |
/// |
/// |
/// Prawda, jeśli bieżący zestaw jest supersetem; W przeciwnym razie fałsz. |
/// |
/// Kolekcja do porównania z bieżącym zestawem. |
/// |
public bool ispersetof (INumerable < T >Inny ) |
if (inne == null) rzuć nowe argumentnullexception („inne”); |
Zwróć inne . Wszystkie (zawiera); |
> |
/// |
/// określa, czy bieżący zestaw jest prawidłowym supersetem określonego kolekcji. |
/// |
/// |
/// Prawda, jeśli obiekt jest prawidłowym supersetem |
///; W przeciwnym razie fałsz. |
/// |
/// Kolekcja do porównania z bieżącym zestawem. |
/// |
public bool ispropersupersetof (INumerable < T >Inny ) |
if (inne == null) rzuć nowe argumentnullexception („inne”); |
var intehhasset = nowy hashset < T >( Inny ) ; |
zwróć inny Hashset . Ispropersubsetof (this); |
> |
/// |
/// określa, czy bieżący zestaw jest właściwością (ścisłym) podzbiorem określonego kolekcji. |
/// |
/// |
/// Prawda, jeśli bieżący zestaw jest prawidłowym podzbiorem; W przeciwnym razie fałsz. |
/// |
/// Kolekcja do porównania z bieżącym zestawem. |
/// |
public bool ispropersubsetof (INumerable < T >Inny ) |
if (inne == null) rzuć nowe argumentnullexception („inne”); |
var intehhasset = nowy hashset < T >( Inny ) ; |
zwróć inny Hashset . Ispropersupersetof (this); |
> |
/// |
/// określa, czy bieżący zestaw pokrywa się z określoną kolekcją. |
/// |
/// |
/// True, jeśli bieżące ustawione i dzielą co najmniej jeden wspólny element; W przeciwnym razie fałsz. |
/// |
/// Kolekcja do porównania z bieżącym zestawem. |
/// |
Publiczne bool nakładają się (INumerable < T >Inny ) |
if (inne == null) rzuć nowe argumentnullexception („inne”); |
if (count == 0) zwróć false; |
Zwróć inne . Dowolny (zawiera); |
> |
/// |
/// określa, czy bieżący zestaw i określony zbiór zawierają te same elementy. |
/// |
/// |
/// Prawda, jeśli bieżący zestaw jest równy; W przeciwnym razie fałsz. |
/// |
/// Kolekcja do porównania z bieżącym zestawem. |
/// |
Public Bool Setequals (INumerable < T >Inny ) |
if (inne == null) rzuć nowe argumentnullexception („inne”); |
var intehhasset = nowy hashset < T >( Inny ) ; |
zwróć inny Hashset . SetEquals (this); |
> |
> |
> |
Ten plik zawiera dwukierunkowy tekst Unicode, który może być interpretowany lub skompilowany inaczej niż to, co pojawia się poniżej. Aby przejrzeć, otwórz plik w edytorze, który ujawnia ukryte znaki Unicode. Dowiedz się więcej o dwukierunkowych znakach Unicode
// Ten kod jest dystrybuowany na podstawie licencji MIT. Prawa autorskie (c) 2013 George Mamaladze |
// patrz licencja.txt lub http: // openSource.org/licencje/licencja mit.php |
#region Użyte przestrzeni nazw |
za pomocą systemu; |
za pomocą systemu . Kolekcje . Ogólny ; |
za pomocą systemu . Globalizacja ; |
za pomocą systemu . Linq; |
Korzystanie z Microsoft . VisualStudio . Testtools . Testów jednostkowych ; |
#endregion |
Przestrzeń nazw GMA . Datastructure . Test |
polecenie klasy wewnętrznej |
public const char separator = ‘;’ ; |
Prywatna operacja odczytu m_operation; |
prywatny odczyt t m_item; |
Publiczne polecenie (operacja operacji, pozycja T) |
m_operation = operacja; |
m_item = item; |
> |
Public Void Execut (ISET < T >ustawić ) |
przełącznik (m_operation) |
Operacja sprawy . Dodać : |
ustawić . Add (m_item); |
przerwa ; |
Operacja sprawy . Usunąć : |
ustawić . Usuń (m_item); |
przerwa ; |
Operacja sprawy . Jasne : |
ustawić . Jasne ( ) ; |
przerwa ; |
domyślny : |
Rzuć nowe notSupportedException (String . Format („Operacja [] nie jest obsługiwana. “, m_operation)); |
> |
> |
Publiczne dowództwo statyczne < T >Parse (token smyczkowy) |
var prefixchar = token [0]; |
var iText = token . Podłoże (1); |
var operation = Chartoveration (Prefixchar); |
T pozycja = |
! Strunowy . IsNullOREmPty (itemText) |
? (T) Konwertuj . GangeType (ItemText, typeof (t)) |
: domyślnie (t); |
zwróć nowe polecenie < T >(Operacja, pozycja); |
> |
Prywatne działanie statyczne Chartoveration (Char CH) |
przełącznik (CH) |
sprawa „+”: |
Operacja powrotu . Dodać ; |
sprawa ‘-‘ : |
Operacja powrotu . Usunąć ; |
sprawa ‘#’ : |
Operacja powrotu . Jasne ; |
domyślny : |
Rzuć nowe notSupportedException (String . Format („Operacja [] nie jest obsługiwana. “, ch)); |
> |
> |
> |
Wewnętrzna operacja enum |
Dodać , |
Usunąć , |
Jasne |
> |
[Klasa testowa] |
Zamówienie klasy publicznej |
[ Metoda badania ] |
public void pusta () |
const string input = “”; |
const String oczekiwany = “”; |
Testx (wejście, oczekiwane); |
> |
[ Metoda badania ] |
public void add_one () |
const string input = “+1;”; |
const String oczekiwany = “1”; |
Testx (wejście, oczekiwane); |
> |
[ Metoda badania ] |
public void add_many () |
const string input = “+1; +2; +3; +4; +5; +6”; |
const String oczekiwany = “1; 2; 3; 4; 5; 6”; |
Testx (wejście, oczekiwane); |
> |
[ Metoda badania ] |
public void add_many_then_clear () |
const string input = “+1; +2; +3; +4; +5; +6;#”; |
const String oczekiwany = “”; |
Testx (wejście, oczekiwane); |
> |
[ Metoda badania ] |
public void add_many_then_clear_then_add () |
const string input = “+1; +2; +3; +4; +5; +6;#;+4; +3; +2;”; |
Const String oczekiwany = „4; 3; 2”; |
Testx (wejście, oczekiwane); |
> |
[ Metoda badania ] |
public void adds_and_removes_mixed () |
const string input = “+1; +2; +3; +4; -2; -3; +2; +3; +5”; |
const String oczekiwany = “1; 4; 2; 3; 5”; |
Testx (wejście, oczekiwane); |
> |
private void testx (wprowadzanie stringów, oczekiwano ciąg) |
Ustawiłem < int >set = new OrderEdSetExt < int >(); |
Execute (ustaw, input); |
Assertset (oczekiwany, set); |
> |
prywatny void Assertset < T >(Oczekiwane ciąg, ieeNumerable < T >rzeczywisty ) |
var extactedArray = |
oczekiwany |
. Split (polecenie < int >. Separator) |
. Gdzie (s => ! strunowy . Isnullorempty (s)) |
. Wybierz (token => Konwertuj . Gangtype (token, typeof (t))) |
. Rzucać < T >(); |
AsserTenumerables (expactedArray, faktyczne); |
> |
Prywatne statyczne pusteczki < T >(INumerable < T >Oczekiwane, enumerable < T >rzeczywisty ) |
String separator = polecenie < T >. Separator . Toostring (CultureInfo . Niezmiennik); |
String OczekiwanoText = String . Dołącz (separator, oczekiwane . Wybierz (item => Konwertuj . ToString (item))); |
String AutealText = String . Dołącz (separator, rzeczywisty . Wybierz (item => Konwertuj . ToString (item))); |
Zapewniać . AreEqual (oczekiwany tekst, faktyczna tekst); |
> |
Prywatna pustka egzekucja (ISET < int >SET, Program String) |
var polecenia = |
program |
. Split (polecenie < int >. Separator) |
. Gdzie (s => ! strunowy . Isnullorempty (s)) |
. Wybierz (polecenie < int >. Parsia); |
foreach (polecenie var w poleceń) |
Komenda . Wykonaj (set); |
> |
> |
> |
> |