2015-12-07 3 views
2

В качестве примера к моему вопросу ... Скажем, у меня есть ArrayList, содержащий Car объектов. A Car объект состоит из Model и ColourEnum. Я хочу, чтобы подсчитать, сколько автомобилей модели типа Audi в списке, Audi является ENUMКак подсчитать частоту перечисления в ArrayList объекта

У меня есть ИНТ переменной INT Audi

И я пытаюсь Audi=Collections.frequency(list, Model.AUDI);

Однако это не подсчет частоты и Audi=0

Где я ошибаюсь и как подсчитать частоту перечисления?

+0

Пожалуйста, покажите исходный код для 'Car' класс. – Jason

+1

Ваш «список» - это не список моделей, а автомобилей. Когда цикл «частота» сравнивает найденный «автомобиль» с «моделью», вы проходили мимо, так как никакой автомобиль не равен модели, вы получаете '0'. – Pshemo

ответ

2

Collections.frequency работает только в том случае, если массив содержит объекты того же типа, что и переданный объект. В этом случае у вас есть массив типа <Car> и проверяют объект типа Model (экземпляр Car никогда не будет равен модели перечисления).

Вам нужно будет написать свой собственный цикл, чтобы пройти и выполнить подсчет (это должно быть легко).

3

Неправильное использование вами Collections.frequency; Вы ищете в списке Car с для Model перечисления, так что не удивительно, что граф является 0.

Если вы используете Java 8, вы можете настроить Stream, так что вы можете filter содержимое и затем count остальных элементов. Это предполагает, что Car имеет метод геттера getModel.

long audi = list.stream().filter(c -> c.getModel() == Model.AUDI).count(); 
0

Другой подход (требуется java8) является первой GroupBy (в вашем случае группиЕ самостоятельно), который возвратит Map<Car, List<Car>>, проходя Collectors.counting() вернет карту

import java.util.List; 
import java.util.function.Function; 
import java.util.stream.Collectors; 
import com.google.common.collect.Lists; 

//guava & pseudocode 
List<Car> listOfCars = Lists.newArrayList(Car.AUDI, Car.BMW, Car.AUDI, Car.AUDI, Car.BMW); 

listOfCars.stream() 
     .collect(Collectors.groupingBy(
       Function.identity(), 
       Collectors.counting()));