2015-05-18 15 views
5

Mam listę, w której muszę dodać prefiks we wszystkich elementach mojej listy.Jak skutecznie dodać prefiks do wszystkich elementów listy?

Poniżej jest sposób, w jaki robię to przez iterowanie listy, a następnie dodanie jej. Czy istnieje inny lepszy sposób na zrobienie tego? Jakieś dwie linijki, które mogą robić te same rzeczy?

private static final List<DataType> DATA_TYPE = getTypes(); 

public static LinkedList<String> getData(TypeFlow flow) { 
    LinkedList<String> paths = new LinkedList<String>(); 
    for (DataType current : DATA_TYPE) { 
     paths.add(flow.value() + current.value()); 
    } 
    return paths; 
} 

muszę wrócić LinkedList ponieważ używam kilka metod klasy LinkedList jak removeFirst.

Jestem na Java 7 od teraz.

+0

Używaj strumieni Java 8 z 'map'. –

+0

Używam niestety Java 7. – user1950349

Odpowiedz

7

Dla jednej wkładki, użyj Java 8 strumieni:

List<String> paths = DATA_TYPE.stream().map(c -> flow.value() + c.value()).collect(Collectors.toList()); 

Jeśli trzeba produkować LinkedList, należy użyć innego kolekcjonera.

+0

Niestety korzystam z Java 7. – user1950349

+2

@ user1950349 W języku Java 7 implementacja wygląda tak krótko, jak tylko może być. – Eran

3

Implementacja wygląda ok, ale jeśli chcesz coś innego, spróbuj tego:

public static List<String> getData(final TypeFlow flow) { 
    return new AbstractList<String>() { 
     @Override 
     public String get(int index) { 
      return flow.value()+DATA_TYPE.get(index).value(); 
     } 

     @Override 
     public int size() { 
      return DATA_TYPE.size(); 
     } 
    }; 
} 

W ten sposób można utworzyć „wirtualną listę”, która w rzeczywistości nie zawiera danych, lecz oblicza go na bieżąco.

+0

Jaka jest różnica między wersją a moją wersją? Co masz na myśli mówiąc o wirtualnej liście? – user1950349

+0

Nie wymaga dodatkowej pamięci poza stałą wielkością 20-30 bajtów. I nie wykonuje żadnej konkatenacji ciągów dopóki nie rozpoczniesz przechodzenia przez tę listę. Twoja wersja tworzy wszystkie prefiksowane ciągi i zapisuje je w pamięci z wyprzedzeniem, co zabiera O (n) dodatkową pamięć, gdzie n jest rozmiarem listy 'DATA_TYPE'. W twoim przypadku prawdopodobnie to nie ma znaczenia, ale jeśli masz miliony wpisów w 'DATA_TYPE', ślad pamięci może się znacznie różnić. –

+0

Bardzo ciekawa implementacja! – marcolopes

Powiązane problemy