使用'Collections.frequency'来获取给定一个值的实例计数

时间:2016-03-30 11:50:18

标签: java collections frequency

为了简化我正在做的事情,让我们使用我修改了几位的learnfromexamples.com示例。

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查找给定一个变量的频率,例如产生4的Collections.frequency(empList,"Sahana");

另一种选择是我可以使用HashMap来保持计数,但是让我说我​​对Collections.frequency印象深刻并尝试使用它。

3 个答案:

答案 0 :(得分:2)

不,鉴于您实施equals,这是不可能的。在Java-8而不是Collections.frequency中,您可以改为使用Stream API:

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

答案 1 :(得分:2)

foreach ($everything as $innerArray) { if (is_array($innerArray)){ foreach ($innerArray as $value) { echo $value['nazev_1']; } } } 不适合多次存储对象。设置从中删除重复项。您需要在代码中进行一些更改才能使其成功

  • 使用Sets或任何其他列表实施,而不是ArrayList
  • 在您的HashSet方法中,对比equals()empno完成对象的相等性。因此,您应该在创建{时使用相同的empName值添加到集合以传递相等比较时的{1}}对象。否则,需要修改equal()方法。

代码更改为“003”而不是“004”

empno

并删除以下行

Employee

其中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方法的用途。

要根据'empName'获取计数,您应该选择

之类的自定义实现
employee

答案 2 :(得分:1)

来自JavaDoc本身

  

返回指定集合中等于的元素数   指定的对象。更正式地说,返回元素的数量e   在集合中(o == null?e == null:o.equals(e))。

所以是的,你可以使用Collections.frequency。但是你必须小心使用equals方法并根据你的实现覆盖它,这将为Collections.frequency方法识别相等的对象