2016-03-30 3 views
0

Чтобы упростить то, что я делаю, давайте воспользуемся примером из learnfromexamples.com, чтобы изменить несколько бит.используйте 'Collections.frequency', чтобы получить количество экземпляров с одним значением

package test; 
import java.util.StringTokenizer; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.HashSet; 
import java.util.List; 
import java.util.Set; 


class Employee { 
     private String empno; 
     private String empName; 

     public Employee(String empno, String empName) { 
      this.empno = empno; 
      this.empName = empName; 
     } 

     public String getEmpno() { 
      return empno; 
     } 

     public void setEmpno(String empno) { 
      this.empno = empno; 
     } 

     public String getEmpName() { 
      return empName; 
     } 

     public void setEmpName(String empName) { 
      this.empName = empName; 
     } 
     @Override 
     public String toString() { 
      return "Empno is "+ empno + " Empname is " + empName; 
     } 
     public Employee() { 
      // TODO Auto-generated constructor stub 
     } 

     @Override 
     public boolean equals(Object arg0) { 
      // TODO Auto-generated method stub 
      boolean flag = false; 
      Employee employee = (Employee) arg0; 
      if(null!= employee && employee.getEmpName().equalsIgnoreCase(empName) && employee.getEmpno().equalsIgnoreCase(empno)){ 
       flag = true; 
      } 
      return flag; 
     } 

    } 


public class Test { 
    public static void main(String[] args) { 

     List<Employee> empList = new ArrayList<Employee>(); 
     empList.add(new Employee("001", "Shidhar")); 
     empList.add(new Employee("002", "Pathy")); 
     empList.add(new Employee("003", "Sahana")); 
     empList.add(new Employee("003", "Sahana")); 
     empList.add(new Employee("004", "Sahana")); 
     empList.add(new Employee("003", "Sahana")); 

     //Get the occurrence of "new Employee("003", "Sahana")" from empLists 
     //int sahanaCount = Collections.frequency(empList, new Employee("003")); 
     //System.out.println("Count of sahana is : " +sahanaCount); 

     Set<Employee> uniqueId = new HashSet<Employee>(empList); 
     for (Employee emId : uniqueId) { 
      System.out.println("The emp with id "+emId.getEmpno()+" was repeated: " 
        + Collections.frequency(empList, emId.getEmpName())); 
     } 

    } 
} 

Можно ли использовать Collections.frequency найти частоту с учетом одной переменной, например, Collections.frequency(empList,"Sahana");, который дает 4.

Другой вариант - я могу использовать HashMap для хранения счета, но скажем, что меня впечатлил Collections.frequency и попытайтесь его использовать.

ответ

2

Нет, это невозможно с учетом вашей реализации equals. В Java-8 вместо Collections.frequency вы можете использовать поток API вместо:

empList.stream().map(Employee::getEmpName).filter(emId.getEmpName()::equals).count(); 
+0

Спасибо за ваше предложение, но, скажем, я извлекаю 'equals' метода. Является ли это возможным? – bensw

+0

@ bensw, вы можете переопределить сравнение «равно» по имени (игнорируя empno). Но это может вызвать проблемы в каком-то другом коде, поэтому я бы не рекомендовал это как общее решение. –

+0

Я пробовал это, но, к сожалению, он выводил все 0s, которые не совсем понравились тем, что я ожидал. Другими словами, это ничего не считало. Вы знаете, что могло пойти не так? – bensw

1

От JavaDoc сама

Возвращает количество элементов в указанной коллекции, равной указанного объекта. Более формально возвращает количество элементов e в коллекции таких, что (o == null? E == null: o.equals (e)).

Итак, да, вы можете использовать Collections.frequency. Но вы должны быть осторожны с методом equals и переопределить его в соответствии с вашей реализацией, которая будет определять одинаковые объекты для метода Collections.frequency.

+0

Привет, спасибо за ваш ответ. Если я удалю его, будет ли он работать? Я не знал, что это сильно повлияет на мой код. – bensw

+0

@ bensw, если вы удалите равных, это не будет работать. –

2

Sets не подходят для хранения объекта несколько раз. Устанавливает удаление дубликатов. Вы должны иметь несколько изменений в коде, чтобы сделать эту работу из

  • Использования ArrayList или любой другой реализации списка вместо HashSet
  • В вашем методе equals() равенство объекта осуществляется сравнение как empno и empName .so, вы должны использовать то же значение empno при создании объекта Employee при добавлении в коллекцию для прохождения сравнения равенства. В противном случае метод equal() должен быть изменен.

Изменение кода будет "003" вместо "004"

empList.add(new Employee("003", "Sahana")); 
empList.add(new Employee("003", "Sahana")); 
empList.add(new Employee("003", "Sahana")); 
empList.add(new Employee("003", "Sahana")); 

и удалить строку ниже

Set<Employee> uniqueId = new HashSet<Employee>(empList); 

где HashSet принимает список в качестве аргумента. Теперь, просматривать список непосредственно

for (Employee employee : empList) { 
      System.out.println("The emp with id "+employee.getEmpno()+" was repeated: " 
        + Collections.frequency(empList, employee); 
     } 

и, наконец, передать экземпляр employee вместо передачи empName экземпляра employee. Это должно печатать количество повторяющихся объектов, присутствующих в списке. Это то, для чего предназначен метод Collections.frequency.

Чтобы получить счетчик, основанный на «EmpName», вы должны пойти на пользовательскую реализацию как

private int getCount(String empName){ 
    int count = 0; 
    for (Employee employee : empList) { 
     if(employee.getEmpName() != null && employee.getEmpName().equals(empName)){ 
count++; 
} 
      } 
return count; 
}  

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

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