2015-01-21 5 views
0

У меня есть связанный список классов, которые содержат 3 строки и двойной. Я хочу собрать общее значение каждого двойника в списке. Например,Java: выберите несколько элементов в Связанный список

LinkedList<Person> L = new LinkedList<Person>(); 
Person p1 = new Person("Fee","Foo","Bar", 1.2); 
Person p2 = new Person("Fi","Fi","Fo", 2.5); 
L.add(p1); 
L.add(p2); 

Я хотел бы найти и добавить 1.2 и 2.5. Я предполагаю, что я должен использовать ListIterator, но как мне сказать, чтобы добавить каждое найденное двойное значение к общей сумме?

+1

Для уточнения: вы спрашиваете, как перебрать список? – Atuos

+0

Нет, я знаю об Итерации, я просто хочу выбрать определенные элементы из списка с разными типами данных. – user3300735

+0

Список содержит только один тип: Person. – Atuos

ответ

2

У вас есть несколько вариантов, перебрать его

А) С помощью итератора, как спросил

Person person = new Person(); 
ListIterator<Person> listIterator = L.listIterator(); 

while (listIterator.hasNext()) { 
     person = listIterator.next(); 
     double value = person.getDoubleAttribute(); 
} 

B) Используйте петлю for-each, как предлагается в другом ответе:

for(Person person : L){ 
    double value = person.getDoubleAttribute(); 
} 

PS: сильно обескуражен, чтобы начать Java переменные или атрибуты по UPPERCASE

+1

Я знаю, что вы будете ненавидеть меня;), но, говоря об использовании памяти, было бы лучше не помещать 'Person person = ...' вне цикла? Потому что теперь он резервирует новое пространство памяти на каждой итерации? – KnutKnutsen

+0

LOOOOOOOL ..... подлинный .... сделано ... –

1

Вы можете перемещаться по списку, получить двойное свойство каждого человека и просуммировать их, или вы можете использовать Java 8 потоков:

double sum = L.stream().mapToDouble(Person::getDoubleProperty).sum(); 

Где getDoubleProperty обозначает имя метода в Person классе возвращая двойное значение.

2

Просто использовать для перебрать лиц:

double sum = 0; 
for(Person p : L) 
    sum += p.getDouble(); 
System.out.print(sum); 
+1

Я думаю, что ваш подход лучше, чем принятый ответ;), но пропускать скобки следует избегать из-за увеличения коэффициента ошибок при расширении цикла. См. Http://stackoverflow.com/questions/8020228/is-it-ok-if-i-omit-curly-braces-in-java – KnutKnutsen

+0

@KnutKnutsen Используйте цикл 'for each', возможно, это самый простой способ, но не оптимальный. Также ОП попросил «Итератор» в LinkedList ... –

+0

@JordiCastilla почему не оптимальный? Конечно, он попросил «Итератор», но насколько я знаю, каждый цикл будет внутренне преобразован в аналогичный подход. Даже Oracle использует использование for-each, см. Http://docs.oracle.com/javase/7/docs/technotes/guides/language/foreach.html – KnutKnutsen