Dobre praktyki programistyczne

Jak przeglądać listę z indeksem

10.04.2012

Jest wiele metod na przechodzenie po obiektach listy czy innej kolekcji w Javie. Czasem potrzebny jest też bieżący indeks, zwłaszcza w przypadku list, gdzie kolejność elementów ma znaczenie. Można to osiągnąć na wiele sposobów. Spójrz na przykłady:

  1. public static void main(String[] args) {
  2. List<String> list = Arrays.asList("zero", "one", "two", "three");
  3. standardLoop(list);
  4. forEachWithLocalVariable(list);
  5. listIterator(list);
  6. }

Wszystkie 3 metody wypisują taki sam wynik:

0 zero
1 one
2 two
3 three
  1. private static void standardLoop(List<String> list) {
  2. System.out.println("#1. Standard for loop");
  3. for (int i = 0, n = list.size(); i < n; i++) {
  4. System.out.println(i + " " + list.get(i));
  5. }
  6. }
Pierwsza metoda jest krótka, ale wymaga 1 lub 2 zmiennych lokalnych (zależnie od tego czy użyte zostało n = list.size()).

  1. private static void forEachWithLocalVariable(List<String> list) {
  2. System.out.println("#2. For-each with local variable");
  3. int i = 0;
  4. for (String element : list) {
  5. System.out.println(i + " " + element);
  6. i++;
  7. }
  8. }
Ta metoda jest dłuższa i wymaga zmiennej lokalnej poza pętlą. W przypadku użycia wielu takich pętli w jednym bloku, musisz pamiętać o wyczyszczeniu tej zmiennej (i = 0) lub użyciu innej.

  1. private static void listIterator(List<String> list) {
  2. System.out.println("#3. List iterator");
  3. for (ListIterator<String> it = list.listIterator(); it.hasNext();) {
  4. System.out.println(it.nextIndex() + " " + it.next());
  5. }
  6. }
Tutaj tylko iterator jest zmienną lokalną. Dla tego przykładu należy pamiętać o tym, że każde wywołanie next(), w przeciwieństwie do get(), daje inny obiekt. Jeśli chcesz używać jakiegoś elementu wiele razy w pętli, to najlepiej przypisać next() do zmiennej.

Z tych 3 metod, powinno się unikać drugiej. Wprowadza niepotrzebną zmienną i jest podatne na błędy przy powtarzających pętach w tym samym bloku. Trzeci przykład jest prawdopodobnie tym, czego się powinno użyć. Pierwszy przypadek jest dobry, gdy jest potrzebna większa kontrola listy (np. dostęp do innych elementów listy w tym samym czasie).

Leave a Response