2013-07-12 11 views
7

chcę zrobić coś jakTworzenie zestawu tablic w Javie

Set <String[]> strSet = new HashSet <String[]>(); 

Czy istnieje prosty sposób, aby zestaw tablic w Javie, czy muszę kodować własną implementację? Dodanie obiektu do zestawu sprawdza obiekt za pomocą equals(), który nie działa dla tablic.

Odpowiedz

12

Tablice nie zastępują equals i hashCode, a więc HashSet będzie je porównywać wyłącznie na podstawie równości referencyjnej. Rozważyć użycie List S zamiast:

Set<List<String>> strSet = new HashSet<List<String>>(); 

Z dokumentacji List.equals:

Returns true wtedy i tylko wtedy, gdy określony obiekt jest także lista, obie listy mają ten sam rozmiar, a wszystkie odpowiednie pary elementy na obu listach to równe.

+0

Jest to prawdopodobnie najlepsze rozwiązanie. – Chase

+3

niektóre zestawy nie używają równych i hashCode jak sortedset "..Arrays nie zastępują equals i hashCode, a więc Set będzie c .." powinien być HashSet zamiast zestawu – nachokk

+0

@nachokk Dobry połów - dzięki. –

6

Użyj Set<List<String>>. W razie potrzeby możesz użyć konwersji Arrays.asList i List.toArray dla konwersji.

+2

+1 Za wzmiankę o 'Arrays.asList' (co jest prostym widokiem" List "tablicy zaplecza). –

0

Jeśli naprawdę potrzebujesz Set<String[]>, nie ma na to łatwego i eleganckiego sposobu, AFAICT. Problem polega na tym, że tablice z jednej strony nie zastępują equals() i hashCode(). Z drugiej strony klasa HashSet nie daje możliwości przekazania jakiejś "strategii" do niej, która zaimplementuje kod mieszający i obliczenia równości na zewnątrz (coś takiego jak Comparator). Więc możesz rozważyć utworzenie TreeSet z niestandardowym komparatorem. Niestety, nie znam żadnej implementacji komparatora tablicowego, więc najprawdopodobniej będziesz musiał napisać własną.

Jeśli jest w porządku, aby mieć Set<List<String>>, można rozważyć porady w innych odpowiedziach.