2015-07-13 20 views
5

Wiem, że struktura danych może przechowywać unikalne łańcuchy i mówić, że łańcuch jest obecny ze złożonością O (1), ponieważ używa kodu skrótu. Czy tę samą złożoność można osiągnąć, jeśli chcę zignorować przypadek z listu? Następny przypadek powinien zadziałać:Struktura danych przechowująca ciągi znaków i ignorująca wielkość liter

Set<String> set = new IgnoreLetterCaseSet(); 
set.add("New York"); 
set.contains("new york") == true; 
set.contains("NEW YORK") == true; 

set.each(it -> print it) ---> prints "New York" 

Czy możliwe jest wdrożenie takiej struktury danych?

+0

@dave ostatniej linii kodu - drukuje w Nowym Jorku, jako że została włożona, nie można znormalizować ciąg do małych liter przy wstawianiu –

+0

Co się stanie, jeśli utworzysz nową klasę, która rozszerzyła 'String', przesłaniając metody' .equals() 'i' .hashCode() '? –

+1

@jameslarge Klasa String jest ostateczna, nie może być przedłużona. – dave

Odpowiedz

3

Wystarczy użyć HashMap z oryginalnego łańcucha jako wartość i małymi literami jeden dla klucza

Map<String, String> map = new HashMap<>(); 
map.add("New York".toLowerCase() ,"New York"); 
map.containsKey("new york".toLowerCase()) == true; 
map.containsKey("NEW YORK".toLowerCase()) == true; 

map.values().each(it -> print it) ---> prints "New York" 
+0

, więc muszę owinąć mapę HashMap, aby uzyskać O (1) –

6

Być może TreeSet jest tym, czego szukasz?

TreeSet<String> ts=new TreeSet<String>(String.CASE_INSENSITIVE_ORDER); 
+1

'SortedSet ts = new TreeSet <> (String.CASE_INSENSITIVE_ORDER);' gdzie 'CASE_INSENSITIVE_ORDER' jest komparatorem. –

+0

ładne, ale czy można to zrobić w O (1)? –

0

jestem zaznajomiony z Java, ale tutaj są dwa pomysły, w jaki sposób można to zrobić:

  1. zdefiniować nową porównywarka do wykorzystania w HashSet że ignoruje sprawy.
  2. Mieć HashSet posiadać listę string s, wszystkie mają ten sam klucz. Oznacza to, że New York i NEW YORK znajdą się na liście pod kluczem new york.