2017-01-03 14 views
0

У меня есть объект с именем Elementfisa, который содержит значения (id, Post, Sarcina). Теперь Post (Int Id, String Nume, String Tip) и Sarcina (Int Id, String Desc) также являются объектами. У меня есть список всех элементов, которые я добавил как Elementfisa, и я хочу получить в отдельном списке частоту каждой Сарсины, которую содержит каждая Elementfisa. Это мой код прямо сейчас:Частота значения в списке объектов

int nr=0; 
    List<Integer> frecv=new ArrayList<Integer>(); 
    List<Sarcina> sarcini = new ArrayList<>(); 
    List<Elementfisa> efuri=findEFAll(); 
    for (Elementfisa i : efuri) 
    { 
     nr=0; 
     for (Sarcina s : sarcini) 
      if (s.equals(i.getSarcina())) 
        nr=1; 
     if (nr==0) 
     { 
      int freq = Collections.frequency(efuri, i.getSarcina()); 
      sarcini.add(i.getSarcina()); 
      frecv.add(freq); 
     } 
    } 

(findEFAll() возвращает каждый элемент, содержащийся в Hashmap из хранилища) Но по какой-то причине, в то время как sarcini список содержит все Sarcina от каждого Elementfisa, список частот будет показывать 0 в каждой позиции. Что я должен изменить, чтобы каждая позиция отображала правильное количество случаев?

+0

ли efuri пусто? – Moira

+0

Нет, он содержит объекты Elementfisa (id, Post, Sarcina) – Artyomska

+0

Вы можете заменить 'if (nr == 0)' на 'if (! Sarcini.contains (i.getSarcina())) и устранить' nr' код. Кроме того, вы переопределили 'equals()'? – Moira

ответ

1

Вы используете Collections.frequency() по телефону efuri, a List<Elementfisa>. Но вы проезжаете i.getSarcina(), объект Sarcina. A ListElementfisa не может содержать объект Sarcina, поэтому вы получаете нуль. Возможно, вы отправили неправильный список методу.


Edit:
Чтобы посмотреть на все Sarcina с в efuri, вы можете сделать это с помощью Java 8 потоков:

efuri.stream().map(element -> element.getSarcina()) 
    .collect(Collectors.toList()).contains(i.getSarcina()) 

Разбивка:

efuri.stream() //Turns this into a stream of Elementfisa 
.map(element -> element.getSarcina()) //Turns this into a stream of Sarcina 
.collect(Collectors.toList()) //Turn this into a list 
.contains(i.getSarcina()) //Check if the list contains the Sarcina 
+0

Я думал, что это проблема, но как я могу извлечь из «efuri» Sarcina, поэтому я могу сравнить ее с i.getSarcina ()? Или есть другой метод для сравнения текущего i.getSarcina() с каждым значением Sarcina от «efuri», так что я могу получить частоту? – Artyomska

+0

@Artyomska Отредактированный ответ. – Moira

+0

Большое спасибо. Решение сработало, и теперь я получаю правильную частоту :) – Artyomska

0

Вы уверены, что вы делаете не нужно переопределять equals() от Elementisa? (и hashcode() тоже). По умолчанию Java equals(), похоже, не получает то, что вы хотите, потому что он будет проверять идентификатор (а не значение) двух объектов Elementisa, тогда как в вашей логике два таких объекта с одинаковыми значениями могут рассматриваться как эквивалентные.

Для получения дополнительной информации о equals() см

What issues should be considered when overriding equals and hashCode in Java?

+0

Сам список содержит 'Elementisa', но они проверяют, содержит ли список« Sarcina's », equals не помогли бы здесь – Moira

 Смежные вопросы

  • Нет связанных вопросов^_^