2010-02-23 24 views
6

Tworzę TableModel, który będzie miał stałą liczbę kolumn, ale liczba wierszy będzie się zmieniać (głównie, zwiększając w funkcji czasu). Co byłoby lepsze podejście do przechowywania danych,ArrayList z tablic vs. tablica ArrayLists vs. coś podobnego

ArrayList[] columns = new ArrayList[numberOfColumns]; 
// Each array element is one column. Fill each of them with a new ArrayList. 
... 
public Object getValueAt(int row, int column) { 
    return columns[column].get(row); 
} 

tj tworząc tablicę ArrayList S, każda ArrayList reprezentujący jedną kolumnę, czyli

ArrayList<Object[]> rows = new ArrayList<Object[]>(); 
// Each ArrayList element is one row. 

public Object getValueAt(int row, int column) { 
    return rows.get(row)[column]; 
} 

tj tworząc jeden ArrayList, która posiada tablic, każda z które reprezentują jeden rząd.

Jakieś pomysły, które z nich są bardziej wydajne pod względem szybkości lub miejsca przechowywania? Opcja 1 wymaga rozszerzenia N ArrayList s dla każdego dodanego wiersza, podczas gdy wariant 2 wymaga rozszerzenia tylko jednego ArrayList, ale także utworzenia nowej tablicy o długości N (reprezentującej nowy wiersz). Czy istnieje oczywiste, lepsze rozwiązanie?

+0

dobre pytanie. Czy chcesz łatwo zmienić liczbę wierszy i/lub kolumn? Dodatkowo, czy chcesz, aby wiersze miały kolumny o różnych długościach? Edycja: moja zła, nie w pełni przeczytałem pierwszej części twojego pytania. – Tom

+0

Tak, liczba kolumn jest stała, ale zmienia się liczba wierszy. –

Odpowiedz

6

Jeśli liczba kolumn jest ustalona, ​​twoje dane prawdopodobnie są zorientowane w rzędzie lub co najmniej zmienną wiersza, w którym to momencie każdy wiersz powinien być tablicą. Poprawiona liczba kolumn oznacza, że ​​nie musisz ponownie przydzielać swojej tablicy.

Więc struktura jest następująca:

List<Object[]> rows; 

gdzie element tablicy jest jeden wiersz.

Istnieje kilka opcji, co Twój obiekt rząd powinien być jednak:

  1. Tablica;
  2. A List lub inny Collection; lub
  3. Obiekt niestandardowy.

(3) można prawdopodobnie wykonać za pomocą interfejsu, który pozwala na zapytanie o liczbę, typ i nazwę kolumn.

+0

Dzięki, myślę, że to jest najczystsze rozwiązanie. –

+0

Oczywiście wykonanie tablicy Object spowoduje boksowanie i rozpakowywanie umieszczanych w nim danych. To dość duża wada. –

2

Jak o użyciu pojedynczego ArrayList się i dostępu do elementu jak ten

public Object getValueAt(int row, int column) { 
    return data.get(row*NUMBER_OF_COLUMNS+column); 
} 

W tym przypadku, każdy ArrayList obiekt jest komórka w tabeli. I nie potrzeba żadnego innego dodatkowego wymagają struktury

+0

To może być rzeczywiście najskuteczniejsza alternatywa - choć nie najłatwiejsza do odczytania. –

+0

Czytelny w przypadku "czytelności kodu"? – vpram86

+0

Mam na myśli to, że na przykład usuwanie wierszy wymaga obliczenia odpowiednich indeksów do "danych", co wymaga pewnej refleksji i zerwania go raz i cała struktura danych jest zrujnowana :-) A zrozumienie tego kodu wymaga nieco więcej wysiłku - ale nie tak wiele. –

1

pójdę z opcji # 2 z kilku powodów

pierwsze macierze mają długość ustala natomiast ArrayList są elastyczne. Biorąc pod uwagę, że twoje # kolumny są naprawione, wydaje się naturalne, że masz tablicę w wierszu.

Opcja nr 1 jest niebezpieczna, ponieważ powoduje niejawne wymaganie, że wszystkie ArrayLists będą tej samej długości. Możesz przypadkowo zaniedbać dodawanie do jednego z nich, tworząc w ten sposób błąd. Nie będziesz mieć tego problemu w opcji nr 2.

Wreszcie, wydaje się, że powszechne przekonanie polega na tym, że najpierw indeksuje się wiersze, a dopiero potem kolumny.

1

Osobiście wybrałabym tablicę o stałej długości (ArrayList).Jeśli mówisz o dużej ilości wierszy, może to być bardziej efektywne pod względem przestrzeni (i być może szybsze) niż przydzielanie wiązki ArrayLists, która zaczyna się od tablicy o długości 10. Tak więc, jeśli masz mniej kolumn niż 10 skończy się zmarnowanym miejscem. Z drugiej strony, jeśli masz więcej, to ArrayList będzie musiała zmienić rozmiar swojej tablicy podkładu po dodaniu dodatkowych kolumn.

Edycja: faktycznie, można ustawić pojemność w konstruktorze ArrayList, więc myślę, że to może nie robi dużej różnicy: http://java.sun.com/j2se/1.5.0/docs/api/java/util/ArrayList.html

Powiązane problemy